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

时间:2016-03-06 20:15:39

标签: c# list contains exists

我有一个字符串列表(thing1-3,else1-3,other1-3),我想用(thing,else,other)创建一个简化列表。看起来很直接(或至少这是经典VB字典.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包含&#34; thing&#34;,&#34; else&#34;,&#34; other&#34;,但它包含thing1-3,else1-2,other1- 3。

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

IntelliSense返回&#34;无法转换为&#39; string&#39;到&#39; System.Predicate&#39;

好的..所以这个:

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

或者

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

这些都不起作用。

显然我可以创建一个迭代整个列表并将其与字符串进行比较的方法,但是这个功能似乎对于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;
}

5 个答案:

答案 0 :(得分:0)

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

首先,您的第一个代码段似乎包含一个拼写错误:您有List<string> myListSimplified但在foreach内引用myListSimplifed(缺少&#39; i&#39;在&#39; f&#39;之后。

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

答案 1 :(得分:0)

除了myListSimplifed vs 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();

答案 2 :(得分:0)

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

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

tested this并且工作正常。

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

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

答案 3 :(得分:0)

在将代码放入Visual Studio时,我注意到了您的拼写错误。结果是正确的,但您的算法远非通用。你能尝试什么:

  1. var对于简化声明非常有用
  2. 列表初始化可以简化
  3. 通过剥离所有数字并在其上执行不同的数据来获取列表

    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();
    

答案 4 :(得分:0)

除了拼写错误之外,您的原始解决方案仍有效。 但是,如果您想要更通用的解决方案,可以使用类似这样的

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;

如果您将尝试此解决方案。