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

我该如何修复它?

LINQ查询检查数组是否包含搜索项

如果我理解正确,那么这是如何。您要检查filterArray中的每个项是否有任何值包含在x.Namey.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;

使用我在方法语法中没有的letHosts.Select,因此ToUpper对每个检查的值执行一次,而不是对filterArray中的每个值执行一次

我还决定将创建filterArray的不同操作链接起来。我觉得这样更清楚