LINQ查询检查数组是否包含搜索项
本文关键字:包含 搜索 是否 数组 查询 检查 LINQ | 更新日期: 2023-09-27 18:16:17
我有以下处理字符串的LINQ查询,我想将其更改为处理数组。我该怎么做呢?
这是当前的LINQ查询(其中FilteredString
是一个字符串)。它工作得很好:
var xFiltered = Services.Where(x =>
x.Name.ToUpper().Contains(xFilteredString.ToUpper() ||
x.Hosts.Select(y => y.Name)
.Any(y => y.ToUpper().Contains(xFilteredString.ToUpper()))));
然而,我正在努力让它在这种情况下工作(下面的代码不工作),我正在检查数组是否包含特定的值:
var xFilteredArray = xFilteredString.Split(',')
var xFilteredArrayToUpper = xFilteredArray.Select(s => s.ToUpperInvariant());
var xFiltered = Services(Where x =>
x.Name.ToUpper().Any(y => xFilteredArrayToUpper.All(x.Name.Contains) ||
x.Hosts.Select(y => y.Name)
.Any(y => y.ToUpper().Contains(xFilteredArrayToUpper.All(x.Name.Contains)))));
我该如何修复它?
如果我理解正确,那么这是如何。您要检查filterArray
中的每个项是否有任何值包含在x.Name
或y.Name
中:
var filterArray = xFilteredString.Split(',')
.Select(s => s.ToUpperInvariant())
.ToList();
var result = Services.Where(x =>
filterArray.Any(filter => x.Name.ToUpper().Contains(filter) ||
x.Hosts.Any(y => filterArray.Any(filter => y.Name.ToUpper().Contains(filter))));
我认为一个更可读的方式将是使用查询语法:
var filterArray = xFilteredString.Split(',')
.Select(s => s.ToUpperInvariant())
.ToList();
var result = from x in Services
let upperName = x.Name.ToUpper()
where filterArray.Any(filter => upperName.Contains(filter)) ||
x.Hosts.Select(host => host.Name.ToUpper())
.Any(host => filterArray.Any(filter => host.Contains(filter)))
select x;
使用我在方法语法中没有的let
和Hosts.Select
,因此ToUpper
对每个检查的值执行一次,而不是对filterArray
中的每个值执行一次
我还决定将创建filterArray
的不同操作链接起来。我觉得这样更清楚