在 LINQ 查询中创建某种循环
本文关键字:循环 创建 LINQ 查询 | 更新日期: 2023-09-27 17:56:07
我有一个方法,我想用它来过滤列表视图。我正在动态创建列表视图,因此我事先不知道列的数量。lstCurrentDynamicItems 是一个只有一个属性的类,该属性名为 c,其类型为 object[]。我创建了该类以保存列表视图的对象。如果我总是拥有相同的列表视图,那么构建以下方法将没有问题。如何实现以下方法?
public void filterListView(string[] columnsContains)
{
// lstCurrentDynamicItems is a list of objects
// columnsContains is what I want to filter.
var qr = from a in lstCurrentDynamicItems
where a.c[0].ToString().Contains(columnsContains[0]) &&
a.c[1].ToString().Contains(columnsContains[1]) &&
a.c[2].ToString().Contains(columnsContains[2]) &&
// ...
// ...
// ...
a.c[columnsContains.Length].ToString().Contains(columnsContains[columnsContains.Length])
select a;
listView.DataContext = qr;
}
这样的事情应该可以工作:
var qr =
from a in lstCurrentDynamicItems
where Enumerable.Range(0,columnsContains.Length)
.All(i => a.c[i].ToString().Contains(columnsContains[i]))
select a;
var qr = from a in lstCurrentDynamicItems
where a.c.Select((item, index) => new { item, index }).
All(o => o.item.ToString().Contains(columnsContains[o.index]))
select a;
这与@digEmAll的答案之间的区别在于,如果columnContains
的元素多于c
集合,他的解决方案将失败,而另一方面,如果columnContains
的元素少于c
集合,则此解决方案将失败。
这是Enumerable.Zip
的完美用途
var qr = from a in lstCurrentDynamicItems
where c
.Zip(columnsContains, (a, b) => a.ToString().Contains(b))
.All(p => p)
select a;
如果序列的长度不相等,则其他一些方法会失败,但这将始终忽略任何长度不匹配,并且只比较现有元素,而不管哪个序列更长。