在linq查询中创建一些循环

时间:2011-05-10 20:51:19

标签: c# linq

我有一个方法可以用来过滤listview。我正在动态创建列表视图,因此我事先并不知道列的数量。 lstCurrentDynamicItems是一个只有一个属性的类,该属性名为c,其类型为object []。我创建了该类以保存listview的对象。如果我总是拥有相同的列表视图,那么构建以下方法就没有问题。我怎样才能实现以下方法?

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

3 个答案:

答案 0 :(得分:2)

这样的事情应该有效:

var qr = 
from a in lstCurrentDynamicItems
where Enumerable.Range(0,columnsContains.Length)
                .All(i => a.c[i].ToString().Contains(columnsContains[i]))
select a;

答案 1 :(得分:1)

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集合,他的解决方案将失败,而另一方面,如果{{1}此解决方案将失败元素少于columnContains集合。

答案 2 :(得分:1)

这是Enumerable.Zip

的完美用法
var qr = from a in lstCurrentDynamicItems
   where c
      .Zip(columnsContains, (a, b) => a.ToString().Contains(b))
      .All(p => p)
   select a;

如果序列长度不相等,其他一些方法会失败,但这将始终忽略任何长度不匹配,并且只比较现有元素,无论哪个序列更长。