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

Check if list contains element that contains a string and get that element

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

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

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

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

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

    尽管如此,我还是不知道如何解决这个问题,但我想我将不得不使用与我类似的问题中建议的LINQ。也就是说,如果是这样的话,我想让回答者向我解释一下Linq在他们的例子中的用法(正如我所说,我在使用c的时候并没有对此感到困扰)。提前感谢各位(和姑娘们?).

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

    1
    2
    3
    4
    5
    6
    7
    8
    string myString ="bla";
    string element ="";

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


    您应该能够在这里使用LINQ:

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

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

    1
    2
    3
    4
    5
    var match = myList
        .FirstOrDefault(stringToCheck => stringToCheck.Contains(myString));

    if(match != null)
        //Do stuff


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

    1
    2
    3
    4
    5
    foreach(string item in myList)
    {
        if(item.Contains(myString))
           return item;
    }

    等效但简明扼要的代码是:

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

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


    1
    2
    3
    4
    5
    string result = myList.FirstOrDefault(x => x == myString)
    if(result != null)
    {
      //found
    }

    1
    2
    3
    4
    5
    6
    7
    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;
        }
    }

    旧的时装圈几乎总是最快的。


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

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

    另一种选择是使用Linq FirstOrDefault

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

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


    您可以使用linq的FirstOrDefault扩展方法:

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

    这将返回包含子字符串myStringnull的第一个元素(如果未找到此类元素)。

    如果只需要索引,则使用List类的FindIndex方法:

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

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


    这里有很多很好的答案,但我使用的是一个简单的方法,如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    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);
    }

    你可以使用

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

    Linq为您提供了"查询"任何数据集合的功能。您可以对集合(这里是字符串的集合(列表))使用类似数据库查询(select、where等)的语法。

    所以你的做法是"从满足给定条件的列表中获取项目"

    在使用"lambda表达式"的位置中

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

    因此,对于参数"item",它返回"item.contains"("必需字符串")。因此,如果项包含字符串,则返回"真",从而从列表中选择它,因为它满足条件。


    为了保持简单,使用这个;

    1
    2
    3
    4
    5
    6
    7
    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循环执行此操作,请使用它;

    1
    2
    3
    4
    5
    6
    7
        for (int iterator = 0; iterator < myList.Count; iterator++)
        {
            if (myList[iterator].Contains("String Pattern"))
            {
                return myList[iterator];
            }
        }


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

    只需使用Any()

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