2011-05-10 4 views
2

나는 listview를 필터링하는 데 사용할 메서드가 있습니다. 동적으로리스트 뷰를 생성하기 때문에 미리 컬럼의 수를 알지 못합니다. 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

위대한 일을했습니다. 감사! –

+0

@ Tomon Nam : 물론'a.c.Length'는 항상'columnsContains.Length'와 같거나 더 커야합니다. – digEmAll

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; 

을위한 완벽한 사용하는 것입니다, 그러나 이것은 항상 길이 불일치를 무시하고 오직 아니, 기존의 요소를 비교합니다 어떤 순서가 더 긴지.