检查列表是否包含包含字符串的元素并获取该元素
本文关键字:元素 获取 字符串 列表 是否 包含包 检查 | 更新日期: 2023-09-27 18:31:01
在寻找这个问题的答案时,我遇到了类似的使用 LINQ 的问题,但我无法完全理解它们(因此,实现它们),因为我不熟悉它。基本上,我想做的是:
- 检查列表的任何元素是否包含特定字符串。
- 如果是这样,请获取该元素。
老实说,我不知道我会怎么做。我能想到的是这个(当然不起作用):
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];
}
你应该能够在这里使用 Linq:
var matchingvalues = myList
.Where(stringToCheck => stringToCheck.Contains(myString));
如果您只是希望退回第一个匹配的项目:
var match = myList
.FirstOrDefault(stringToCheck => stringToCheck.Contains(myString));
if(match != null)
//Do stuff
基本答案是:您需要遍历循环并检查任何元素是否包含指定的字符串。因此,假设代码是:
foreach(string item in myList)
{
if(item.Contains(myString))
return item;
}
等效但简洁的代码是:
mylist.Where(x => x.Contains(myString)).FirstOrDefault();
在这里,x 是一个参数,在上面的代码中充当"item"。
string result = myList.FirstOrDefault(x => x == myString)
if(result != null)
{
//found
}
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;
}
}
旧时尚循环几乎总是最快的。
如果你想要一个包含你的字符串的字符串列表:
var newList = myList.Where(x => x.Contains(myString)).ToList();
另一种选择是使用 Linq FirstOrDefault
var element = myList.Where(x => x.Contains(myString)).FirstOrDefault();
请记住,Contains
方法区分大小写。
使用 Linq 的 FirstOrDefault
扩展方法:
string element = myList.FirstOrDefault(s => s.Contains(myString));
这将返回包含子字符串myString
的 fist 元素,如果没有找到这样的元素,则返回null
。
如果只需要索引,请使用 List<T>
类的 FindIndex
方法:
int index = myList.FindIndex(s => s.Contains(myString));
这将返回包含子字符串 myString
的 fist 元素的索引,如果没有找到这样的元素,则返回-1
。
这里有很多很好的答案,但我使用一个简单的 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);
}
你应该能够使用这样的东西,它对我来说效果很好:
var valuesToMatch = yourList.Where(stringCheck => stringCheck.Contains(myString));
或类似的东西,如果你需要查看它不匹配的地方。
var valuesToMatch = yourList.Where(stringCheck => !stringCheck.Contains(myString));
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"。包含("必需的字符串")"。因此,如果项目包含字符串,则返回 true,因此它从列表中选择,因为它满足条件。
为了保持简单,请使用这个;
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];
}
}
可以组合 Any、Where、First 和 FirstOrDefault;或者根据需要将谓词放在这些方法中的任何一个中。
您可能应该避免使用 First,除非您希望在找不到匹配项时引发异常。FirstOrDefault 通常是更好的选择,只要您知道如果未找到匹配项(字符串的默认值为 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
我没有在其他答案中看到布尔选项,所以我希望下面的代码能帮助某人。
只需使用Any()
string myString = "test";
bool exists = myList
.Where(w => w.COLUMN_TO_CHECK.Contains(myString)).Any();
多种方式检查列表是否为空。
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.
}