检查list是否包含包含字符串的元素并获取该元素

时间:2013-09-12 14:39:55

标签: c# .net linq list contains

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

  1. 检查列表中的任何元素是否包含特定字符串。
  2. 如果是,请获取该元素。
  3. 老实说,我不知道如何去做。我能想到的是这个(当然不起作用):

    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];
    }
    

13 个答案:

答案 0 :(得分:159)

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

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

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

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

if(match != null)
    //Do stuff

答案 1 :(得分:23)

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

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

等效但简洁的代码是:

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

这里,x是一个参数,在上面的代码中就像“item”一样。

答案 2 :(得分:10)

string result = myList.FirstOrDefault(x => x == myString)
if(result != null)
{
  //found
}

答案 3 :(得分: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;
    }
}

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

答案 4 :(得分:4)

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

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

另一种选择是使用Linq FirstOrDefault

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

请注意,Contains方法区分大小写。

答案 5 :(得分:2)

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

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

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

如果你需要的只是索引,请使用List<T>类的FindIndex方法:

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

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

答案 6 :(得分:1)

为了保持简单,请使用它;

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循环执行此操作,请使用此选项;

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

答案 7 :(得分:1)

你可以使用

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表达式就像(输入参数=&gt;返回值)

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

答案 8 :(得分:1)

这里有很多好的答案,但我使用存在的简单答案,如下所示:

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

答案 9 :(得分:1)

您应该可以使用类似这样的东西,对我来说还可以:

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

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

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

答案 10 :(得分:0)

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

只需使用Any()

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

答案 11 :(得分:0)

可以组合Any,Where,First和FirstOrDefault;或仅根据需要将谓词放入任何一种方法中。

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

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上测试此代码

答案 12 :(得分:-1)

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

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

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

2) 使用如下 linq 查询检查列表 null 和计数大于零:-

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