2011-05-10 48 views
2

我有一个方法,我想用来过滤listview。我正在动态创建listview,因此我不知道colums的数量。 lstCurrentDynamicItems是一个只有一个属性的类,该属性名为c,其类型为object []。我创建了这个类来保存listview的对象。如果我总是会有相同的列表视图,那么我会没有问题建立下面的方法。我怎样才能实现以下方法?LINQ查询中创建某种循环

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

像这样的东西应该工作:

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

这很好。谢谢! – 2011-05-10 21:03:10

+0

@Tono Nam:当然你必须确保'a.c.Length'总是等于(或大于)'columnsContains.Length' – digEmAll 2011-05-10 21:06:31

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的回答是,如果columnContainsc收集更多的元素他的解决方案将失败的区别,而这种解决方案另一方面,如果columnContains具有比c集合更少的元素将会失败。

1

这是Enumerable.Zip

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

如果序列不具有相等的长度,一些其他方法失败一个完美的使用,但这总是会忽略任何长度不匹配,只有比较现有的元素,没有问题是哪个序列更长。