2011-05-10 78 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; 

如果序列不具有相等的長度,一些其他方法失敗一個完美的使用,但這總是會忽略任何長度不匹配,只有比較現有的元素,沒有問題是哪個序列更長。