C# list<string> 包含特定字符串

C# list<string> contains specific string

我有一个字符串列表 (thing1-3, else1-3, other1-3),我想创建一个仅包含 (thing, else, other) 的简化列表。看起来很简单(或者至少这是使用 Classic VB Dictionary .Exists 函数),但我被卡住了。所以我正在检查字符串是否以我的简化字符串之一开头,然后如果简化列表不包含该字符串,则添加它。但是检查简化列表是否包含字符串已经让我失望了。

List<string> myList = new List<string>(new string[] { "thing1", "thing2", "thing3", "else1", "else2", "else3", "other1", "other2", "other3" });

List<string> myListSimplified = new List<string>();

foreach (string s in myList)
{
   if (s.StartsWith("thing"))
   {
      if (!myListSimplifed.Contains("thing")) { myListSimplifed.Add("thing"); }
   }

   if (s.StartsWith("else"))
   {
      if (!myListSimplifed.Contains("else")) { myListSimplifed.Add("else"); }
   }

   if (s.StartsWith("other"))
   {
      if (!myListSimplifed.Contains("other")) { myListSimplifed.Add("other"); }
   }
}

我希望这个 mySimplifiedList 包含 "thing"、"else"、"other",但它包含 thing1-3、else1-2、other1-3。

if (myListSimplified.Exists("thing")) { }

IntelliSense returns“无法从 'string' 转换为 'System.Predicate'

好的..所以这个:

if (!myListSimplified.Any(str => str.Contains("thing"))) { myListSimplified.Add("thing"); }

if (!myListSimplified.Exists(str => str.Contains("thing"))) { myListSimplified.Add("thing"); }

None 这些作品。

显然,我可以创建一个方法来遍历列表并将其与字符串进行比较,但是这个功能似乎太基础了,无法列出 MS 遗漏的列表……传递列表似乎也很愚蠢。 ..

private bool Exists(List<string> lList, string sCompare)
{
    bool bVal = false;

    foreach (string s in lList)
    {
        if (s == sCompare) { bVal = true; }
        break;
    }

    return bVal;
}

我不确定你的问题是什么:

首先,您的第一个代码片段似乎包含错字:您有 List<string> myListSimplified,但在 foreach 中您引用了 myListSimplifed(在后面缺少 'i' 'f').

如果我更正了那个拼写错误和 运行 你的代码,我就会得到一个包含 {"thing", "else", "other" } 的列表,这似乎也是你所期望的。

除了 myListSimplifed 与 myListSimplified 中的拼写错误外,您的代码示例生成了您希望它执行的操作。

不是你想要的,但你可以用更少的代码行得到同样的效果:

var myList = new List<string> {"thing1", "thing2", "thing3", "else1", "else2", "else3", "other1", "other2", "other3"};
var myListSimplified = myList.Select(s => new string(s.Where(char.IsLetter).ToArray())).Distinct();

列表是通用数据类型。他们不知道字符串是什么,因此没有提供开箱即用的工具来搜索 StartWithContain 的项目其他字符串。一般而言,这种操作没有意义。这就是为什么你有像 Any 这样的操作,它采用 lambda 函数来提供你自己的逻辑:

if (myList.Any(str => str.StartsWith("thing")))
     mySimplifiedList.Add("thing");

我已经 tested this 并且工作正常。

当然,如果您有多个要提取的字符串,您应该使它更通用。最简单的方法是将上面的行提取到一个接收子字符串("thing",在本例中)作为参数的方法。一种更通用的方法(假设它与您的数据和逻辑匹配)是遍历所有字符串,从中删除所有数字,然后存储它。假设 StripNumerals 是一种接收字符串的方法,它可能看起来像这样,其中 Distinct 确保每个字符串只有一个实例。

var simplifiedList = myList.Select(StripNumerals).Distinct().ToList();

我注意到你在 Visual Studio 中输入代码时的错字。结果是正确的,但您的算法远非通用。你可以尝试什么:

  1. var 有助于简化声明
  2. 列表初始化可以简化
  3. 通过去除所有数字并对其执行 distinct 来获得列表

    var myList = new List<string>() { "thing1", "thing2", "thing3", "else1", "else2", "else3", "other1", "other2", "other3" };
    
    var listWithoutNumbers = myList.Select(s =>
    {
        Regex rgx = new Regex("[0-9]");
        return rgx.Replace(s, "");
    });
    
    var simplifiedList = listWithoutNumbers.Distinct();
    

除了打字错误外,您的原始解决方案有效。 但是,如果你想要更通用的解决方案,你可以使用这样的东西

List<string> myList = new List<string>(new string[] { "thing1", "thing2", "thing3", "else1", "else2", "else3", "other1", "other2", "other3" });

List<string> myListSimplified = myList.Select(s => new String(s.Where(Char.IsLetter).ToArray())).Distinct().ToList();

不要忘记添加

using System.Linq;

如果您愿意尝试此解决方案。