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