C# 检查列表是否包含包含字符串的元素,并获取该元素

C# 检查列表是否包含包含字符串的元素,并获取该元素,c#,.net,linq,list,contains,C#,.net,Linq,List,Contains,在寻找这个问题的答案时,我遇到过使用LINQ的类似问题,但我无法完全理解它们(并因此实现它们),因为我不熟悉它。基本上,我想说的是: 检查列表中的任何元素是否包含特定字符串 如果是,则获取该元素 我真的不知道该怎么做。我能想到的是(当然不起作用): 我知道它为什么不起作用: myList.Contains()不会返回true,因为它会检查列表的整个元素是否与我指定的字符串匹配 myList.IndexOf()将找不到匹配项,因为它将再次检查与字符串匹配的元素 尽管如此,我仍然不知道如何解决这

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

  • 检查列表中的任何元素是否包含特定字符串
  • 如果是,则获取该元素
  • 我真的不知道该怎么做。我能想到的是(当然不起作用):

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

    • 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];
    }
    
    string myString=“bla”;
    字符串元素=”;
    for(int i=0;i
    您应该能够在此处使用Linq:

    var matchingvalues = myList
        .Where(stringToCheck => stringToCheck.Contains(myString));
    
    如果您只想返回第一个匹配项:

    var match = myList
        .FirstOrDefault(stringToCheck => stringToCheck.Contains(myString));
    
    if(match != null)
        //Do stuff
    
    for(int i=0;i
    旧式循环几乎总是最快的。

    您可以使用Linq的扩展方法:

    string element = myList.FirstOrDefault(s => s.Contains(myString));
    
    这将返回包含子字符串的第一个元素
    myString
    ,如果没有找到这样的元素,则返回
    null

    如果您只需要索引,请使用
    列表
    类的方法:


    这将返回包含子字符串
    myString
    ,或
    -1
    的第一个元素的索引(如果未找到此类元素)。

    如果需要包含字符串的字符串列表:

    var newList = myList.Where(x => x.Contains(myString)).ToList();
    
    另一个选项是使用Linq FirstOrDefault

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

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

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

    foreach(string item in myList)
    {
        if(item.Contains(myString))
           return item;
    }
    
    等效但简洁的代码是:

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

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

    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循环执行此操作,请使用以下命令:

    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 (int iterator = 0; iterator < myList.Count; iterator++)
        {
            if (myList[iterator].Contains("String Pattern"))
            {
                return myList[iterator];
            }
        }
    
    for(int iterator=0;iterator
    您可以使用

    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”(“必需字符串”)”。因此,如果项目包含字符串,则返回true,因此它从列表中被选中,因为它满足条件。

    这里有许多好的答案,但我使用一个简单的答案,使用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);
    }
    

    我在其他答案中并没有看到bool选项,所以我希望下面的代码能帮助到一些人

    只需使用
    Any()


    你应该能够使用这样的东西,它对我很有效:

    var valuesToMatch = yourList.Where(stringCheck => stringCheck.Contains(myString));
    
    或者类似的东西,如果你需要寻找不匹配的地方

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

    可以将任何、Where、First和FirstOrDefault组合在一起;或者根据需要将谓词放在这些方法中的任何一个中

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

    使用System.Collections.Generic;
    使用System.Linq;
    布尔存在;
    字符串第一匹配;
    i可数匹配列表;
    var myList=new List(){“foo”、“bar”、“foobar”};
    exists=myList.Any(x=>x.Contains(“o”);
    //存在=>true
    firstMatch=myList.FirstOrDefault(x=>x.Contains(“o”);
    firstMatch=myList.First(x=>x.Contains(“o”);
    //firstMatch=>“foo”
    firstMatch=myList.First(x=>x.Contains(“黑暗面”);
    //引发异常,因为没有元素包含“黑暗面”
    firstMatch=myList.FirstOrDefault(x=>x.Contains(“黑暗面”);
    //firstMatch=>null
    matchingList=myList.Where(x=>x.Contains(“o”);
    //matchingList=>{“foo”,“foobar”}
    

    测试此代码@

    +1-或者在第二种情况下用
    FirstOrDefault
    替换
    Where
    myList.FirstOrDefault(stringToCheck=>stringToCheck.Contains(myString))
    回答得很好。不过出于好奇:为什么
    匹配是由编译器决定的(
    var
    )?既然我知道我的列表类型是
    String
    ,那么在这种情况下使用
    字符串匹配
    是否安全?@JimIliadis“var”和“String”在这种情况下的意思完全相同-编译器足够聪明,知道结果只能是“String”。var实际上只是一种编码风格(不使用匿名时)
    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);
    }
    
    string myString = "test";
    bool exists = myList
                 .Where(w => w.COLUMN_TO_CHECK.Contains(myString)).Any();
    
    var valuesToMatch = yourList.Where(stringCheck => stringCheck.Contains(myString));
    
     var valuesToMatch = yourList.Where(stringCheck => !stringCheck.Contains(myString));
    
    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" }