我有以下处理字符串的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)))));
我该如何解决?
答案 0 :(得分:2)
如果我理解正确,那就是这样的。如果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
的不同操作链接起来。我认为这样更清楚