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

在寻找这个问题的答案时,我遇到过类似的使用 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];
}
769779 次浏览
string result = myList.FirstOrDefault(x => x == myString)
if(result != null)
{
//found
}

你应该可以在这里使用 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 < myList.Length; i++)
{
if (myList[i].Contains(myString)) // (you use the word "contains". either equals or indexof might be appropriate)
{
return i;
}
}

老式时尚圈几乎总是最快的。

您可以使用 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

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

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

另一种选择是使用 LinqFirstOrDefault

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 循环执行此操作;

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

你可以利用

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 表达式类似于(input Parameter = > return value)

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

这里有很多不错的答案,但我使用的是一个使用 存在的简单答案,如下所示:

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

我没有看到布尔选项在其他的答案,所以我希望下面的代码将有所帮助的人。

Any()

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

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

您可能应该避免使用 First,除非您希望在找不到匹配项时引发异常。FirstOrDefault 通常是更好的选择,只要您知道如果没有找到匹配,它将返回类型的默认值(string 的默认值为 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

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

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

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

2)使用 linq 查询检查 list null 和 count 大于0,如下所示:-

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