2013-03-04 2 views
4

List<Container>을 입력하고 Container.Active == true을 입력하고 containerObject.Items > 2 만 입력하면됩니다. 이 방법으로 하위 목록을 필터링하려면 어떻게해야합니까?항목의 하위 목록을 필터링하는 방법

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace ConsoleApplication1 
{ 
    internal class Container 
    { 
     public List<int> Items { get; set; } 
     public bool Active { get; set; } 

     public Container(bool active, params int[] items) 
     { 
      Items = items.ToList(); 
      Active = active; 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var containers = new List<Container> {new Container(true,1, 2, 3), new Container(false, 1,2,3,4,5,6), new Container(true,1,2,5,6,7,8,9,10)}; 
      var result = containers.Where(c => c.Active); 

      foreach (var container in result) 
      { 
       foreach (var item in container.Items) 
       { 
        Console.WriteLine(item);//I should not print any values less than two here 
       } 
      } 
     } 
    } 
} 

필자는 2보다 작은 값을 인쇄해서는 안됩니다.

+0

당신이 컨테이너의 길이가>이해야 의미합니까? – shahkalpesh

+0

'i'는 무엇입니까? '?' ' –

+0

'Items'의 각'int'가 2보다 작아야 함을 의미합니다. 2보다 작은 값은 모두 제거해야합니다. –

답변

8

이 시도 : 표준 양식에서

var result = from container in containers.Where(c => c.Active) 
      from item in container.Items 
      where item > 2 
      select container; 

:

var standard_result = containers 
    .Where(container => container.Active && container.Items.All(i => i > 2)) 
    .SelectMany(con => con.Items); 
+0

+1 이것은 내가 가지고 있었던 것입니다. 마음. 이것을 표준 방식으로 보는 것이 좋을 것입니다. –

+0

@ P.Brian.Mackey - pls는 표준 형식을 사용합니다! –

+0

전혀 작동하지 않는 것 같습니다. – aush

4

봅니다 :

var result = containers.Where(c => c.Active && c.Items.Count() > 2); 
+0

질문이 업데이트되었습니다. 혼란을 드려 죄송합니다. –

+0

@ P.Brian.Mackey - 편집 –

+0

@Downvoter - 관심있는 댓글? 나는 OP의 업데이트 된 답변을 수용하기 위해 내 게시물을 편집했습니다. –

2

Container을 만들어야합니다. 기존 하나를 변경하지 않으려면 마지막 줄은 모든 항목을 필터링하는 경우 반환하지 않도록 확인합니다

var result = containers.Where(c => c.Active) 
    .Select(c=>new Container(c.Active, c.Select(i=>i>2).ToArray())) 
    .Select(c=>c.Items.Count > 0); 

(즉, 당신이 필요로하는 경우 그 코드를 추가합니다).

+0

찾고있는 내용을 반영하도록 답변을 업데이트했습니다. –

2

를 귀하의 의견에서, 나는이 같은 쿼리를 찾고 있다고 가정 :

var result = containers 
    .Where(c => c.Active) 
    .Select(c => new Container(c.Active, c.Items.Where(i => i>2).ToArray())); 

을 2

보다 크지 않은 항목을 걸러 낸 것을 제외하고는 컨테이너 사본을 만듭니다.
+0

후자 버전이 작동합니다. 첫 번째 결과가 없습니다. –

+0

@ P.Brian.Mackey 컨테이너에 2 번째 버전보다 적은 1 개 항목이 모두 들어 있기 때문에 첫 번째 버전을 실제로 만족시키지 못합니다. 두 번째 버전이 어느 정도 찾고 있다고 생각합니까? –

2

당신은 정말 하나의 쿼리에서 그것을 할 필요가없는 경우 :

var result = containers.Where(c => c.Active).ToList(); 
result.ForEach(c => c.Items.RemoveAll(i => i <= 2)); 
관련 문제