【问题标题】:Check if list contains element that contains a string and get that element检查列表是否包含包含字符串的元素并获取该元素
【发布时间】:2013-09-17 00:27:28
【问题描述】:

在寻找这个问题的答案时,我遇到了使用 LINQ 的类似问题,但我无法完全理解它们(因此,实现它们),因为我不熟悉它。我想要的基本上是这样的:

  1. 检查列表的任何元素是否包含特定字符串。
  2. 如果有,请获取该元素。

老实说,我不知道该怎么做。我能想到的是这个(当然不工作):

if (myList.Contains(myString))
    string element = myList.ElementAt(myList.IndexOf(myString));

我知道为什么它不起作用:

  • myList.Contains() 不返回 true,因为它会检查列表的整个元素是否与我指定的字符串匹配。
  • myList.IndexOf() 将找不到匹配项,因为再次出现这种情况,它将检查与字符串匹配的元素。

不过,我不知道如何解决这个问题,但我认为我必须按照与我的类似问题中的建议使用 LINQ。话虽如此,如果这里是这种情况,我希望回答者向我解释他们的示例中使用 LINQ(正如我所说,我在使用 C# 的时候并没有为此烦恼)。提前谢谢你们(和女孩?)。

编辑:我想出了一个解决方案;只需遍历列表,检查当前元素是否包含字符串,然后设置一个等于当前元素的字符串。不过,我想知道,还有比这更有效的方法吗?

string myString = "bla";
string element = "";

for (int i = 0; i < myList.Count; i++)
{
    if (myList[i].Contains(myString))
        element = myList[i];
}

【问题讨论】:

  • 正如我在回答中提到的,旧时尚循环(就像您的问题一样)几乎总是最快的。但如果你足够关心,你可以对其进行测试。
  • 您的列表中可能有多个字符串包含您的字符串myString,在您当前的循环中,您将获得最后一个元素。这取决于你是要找到第一个还是最后一个,如果你只想找到第一个,然后在找到该项目后打破循环。

标签: c# .net linq list contains


【解决方案1】:

你应该可以在这里使用 Linq:

var matchingvalues = myList
    .Where(stringToCheck => stringToCheck.Contains(myString));

如果您只是想返回第一个匹配项:

var match = myList
    .FirstOrDefault(stringToCheck => stringToCheck.Contains(myString));

if(match != null)
    //Do stuff

【讨论】:

  • +1 - 或者在第二种情况下将 Where 替换为 FirstOrDefault myList.FirstOrDefault(stringToCheck =&gt; stringToCheck.Contains(myString))
  • 很好的答案。只是出于好奇:为什么matching 是编译器确定的(var)?既然我知道我的列表是String 类型,那么在这种情况下使用string matching 是否安全?
  • @JimIliadis "var" 和 "string" 在这种情况下的含义完全相同 - 编译器足够聪明,可以知道结果only 是 'string'。 var 实际上只是一种编码风格的东西(当不使用匿名类型时)
  • 评论太旧的线程,但发现一个例外。当您使用 firstordefault() 时,请确保它也可以返回默认值。因此,假设您正在传递一个空字符串,即 mystring ="" 并且您不希望显示任何内容,但它仍然会显示列表的第一项,因为您选择了 firstordefault。
  • "Any" 会更好 var matchingvalues = myList .Any(stringToCheck => stringToCheck.Contains(myString));
【解决方案2】:

基本答案是:您需要遍历循环并检查任何元素是否包含指定的字符串。 所以,假设代码是:

foreach(string item in myList)
{
    if(item.Contains(myString))
       return item;
}

等效但简洁的代码是:

mylist.Where(x => x.Contains(myString)).FirstOrDefault();

这里,x 是一个参数,作用类似于上面代码中的“item”。

【讨论】:

  • vb mylist.Where(x => x.Contains(myString)).FirstOrDefault(); 是怎么写的;
【解决方案3】:
string result = myList.FirstOrDefault(x => x == myString)
if(result != null)
{
  //found
}

【讨论】:

    【解决方案4】:
    for (int i = 0; i < myList.Length; i++)
    {
        if (myList[i].Contains(myString)) // (you use the word "contains". either equals or indexof might be appropriate)
        {
            return i;
        }
    }
    

    旧时尚循环几乎总是最快的。

    【讨论】:

    • 既然我追求效率,您是否建议这种方法更快(因此更有效)?
    • 我还没有对其进行性能测试,但我猜这会更快。只需要一次遍历列表,直到它找到一些东西并提前爆发(就像 Linq 选项如果写得好可能会做),没有 linq 的方法调用开销,也没有 linq 的 lambda 开销。并不是说这些是令人担忧的重大问题,但可能会导致一些性能下降。
    • 为什么不使用 List.Equals()?
    • @V.7 因为他只想知道列表中的一项是否包含子字符串。 list.equals 不是工作的正确工具 [“abc”、“def”、“ghi”] 确实包含 OP 描述的“hi”。 list.equals 甚至没有采用正确的数据类型。
    【解决方案5】:

    如果你想要一个包含你的字符串的字符串列表:

    var newList = myList.Where(x => x.Contains(myString)).ToList();
    

    另一种选择是使用 Linq FirstOrDefault

    var element = myList.Where(x => x.Contains(myString)).FirstOrDefault();
    

    请记住,Contains 方法区分大小写。

    【讨论】:

    • 注意区分大小写,实现StringComparison.InvariantCultureIgnoreCase
    【解决方案6】:

    这里有很多好的答案,但我使用了一个简单的Exists,如下:

    foreach (var setting in FullList)
    {
        if(cleanList.Exists(x => x.ProcedureName == setting.ProcedureName)) 
           setting.IsActive = true; // do you business logic here 
        else
           setting.IsActive = false;
        updateList.Add(setting);
    }
    

    【讨论】:

      【解决方案7】:

      你可以使用 Linq 的 FirstOrDefault 扩展方法:

      string element = myList.FirstOrDefault(s => s.Contains(myString));
      

      这将返回包含子字符串myString 的第一个元素,如果没有找到这样的元素,则返回null

      如果您只需要索引,请使用List&lt;T&gt; 类的FindIndex 方法:

      int index = myList.FindIndex(s => s.Contains(myString));
      

      这将返回包含子字符串myString 的第一个元素的索引,如果没有找到这样的元素,则返回-1

      【讨论】:

        【解决方案8】:

        你应该可以使用这样的东西,它对我来说没问题:

        var valuesToMatch = yourList.Where(stringCheck => stringCheck.Contains(myString));
        

        或类似的东西,如果您需要查看不匹配的位置。

         var valuesToMatch = yourList.Where(stringCheck => !stringCheck.Contains(myString));
        

        【讨论】:

          【解决方案9】:

          你可以使用

          var match=myList.Where(item=>item.Contains("Required String"));
          foreach(var i in match)
          {
          //do something with the matched items
          }
          

          LINQ 为您提供了“查询”任何数据集合的功能。您可以在集合(这里是字符串的集合(列表))上使用数据库查询(选择、位置等)之类的语法。

          所以你正在做类似“从满足给定条件的列表中获取项目”

          在你使用“lambda 表达式”的地方

          简单地说 lambda 表达式类似于 (输入参数 => 返回值)

          所以对于参数“item”,它返回“item.Contains(“required string”)”。因此,如果该项目包含该字符串,则返回 true,从而从列表中选择它,因为它满足条件。

          【讨论】:

            【解决方案10】:

            为了简单起见,请使用这个;

            foreach(string item in myList)//Iterate through each item.
            {
             if(item.Contains("Search Term")//True if the item contains search pattern.
             {
               return item;//Return the matched item.
             }
            }
            

            或者,要使用 for 循环执行此操作,请使用 this;

                for (int iterator = 0; iterator < myList.Count; iterator++)
                {
                    if (myList[iterator].Contains("String Pattern"))
                    {
                        return myList[iterator];
                    }
                }
            

            【讨论】:

            • 只是要指出,您错过了其中一行代码的结束括号.. if( item.Contains("Search Term") )
            【解决方案11】:

            我没有在其他答案中看到 bool 选项,所以我希望下面的代码对某人有所帮助。

            只需使用Any()

            string myString = "test";
            bool exists = myList
                         .Where(w => w.COLUMN_TO_CHECK.Contains(myString)).Any();
            

            【讨论】:

              【解决方案12】:

              可以组合 Any、Where、First 和 FirstOrDefault;或者只是根据需要将谓词放在任何这些方法中。

              您应该避免使用 First ,除非您想在找不到匹配项时抛出异常。 FirstOrDefault 通常是更好的选择,只要您知道如果找不到匹配项,它将返回类型的默认值(字符串的默认值为 null,int 为 0,bool 为 false 等)。

              using System.Collections.Generic;
              using System.Linq;
              
              
              bool exists;
              string firstMatch;
              IEnumerable<string> matchingList;
              
              var myList = new List<string>() { "foo", "bar", "foobar" };
              
              exists = myList.Any(x => x.Contains("o"));
              // exists => true
              
              firstMatch = myList.FirstOrDefault(x => x.Contains("o"));
              firstMatch = myList.First(x => x.Contains("o"));
              // firstMatch => "foo"
              
              firstMatch = myList.First(x => x.Contains("dark side"));
              // throws exception because no element contains "dark side"
              
              firstMatch = myList.FirstOrDefault(x => x.Contains("dark side"));
              // firstMatch => null
              
              matchingList = myList.Where(x => x.Contains("o")); 
              // matchingList => { "foo", "foobar" }
              

              测试这段代码@https://rextester.com/TXDL57489

              【讨论】:

                【解决方案13】:

                您可以通过多种方式检查列表是否为空。

                1)检查列表为空,然后检查计数大于零,如下所示:-

                if(myList!=null && myList.Count>0)
                {
                    //List has more than one record.
                }
                

                2) 使用 linq 查询检查列表是否为空且计数大于零,如下所示:-

                if(myList!=null && myList.Count>0)
                {
                    //List has more than one record.
                }
                

                【讨论】:

                  猜你喜欢
                  • 2017-11-20
                  • 2019-03-16
                  • 2021-10-31
                  • 2010-10-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-07-31
                  相关资源
                  最近更新 更多