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

时间:2016-11-03 20:19:50

标签: c# linq

我有以下处理字符串的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)))));

我该如何解决?

1 个答案:

答案 0 :(得分:2)

如果我理解正确,那就是这样的。如果filterArrayx.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;

在方法语法中使用letHosts.Select是因为ToUpper对每个检查的值执行一次而不是一次对于filterArray中的每个值

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