2013-03-04 94 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

你的意思是集裝箱的長度應> 2? – shahkalpesh 2013-03-04 20:28:44

+0

什麼是'我'?'''' – 2013-03-04 20:29:12

+0

我的意思是'Items'中的每個'int'都應該> 2.小於2的任何東西都應該被刪除。 – 2013-03-04 20:29:41

回答

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這非常符合我在心神。以標準方法形式看到這將是很好的。 – 2013-03-04 20:43:22

+0

@ P.Brian.Mackey - 請準備好標準表格! – 2013-03-04 20:57:37

+0

它似乎並沒有工作。 – aush 2013-03-04 21:32:02

4

嘗試:

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

我更新了這個問題。對困惑感到抱歉。 – 2013-03-04 20:32:14

+0

@ P.Brian.Mackey - 編輯 – 2013-03-04 20:38:51

+0

@Downvoter - 謹慎評論?我編輯了我的帖子以適應OP的更新答案。 – 2013-03-04 20:39:49

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

我已更新我的答案以反映我相信您在尋找的內容 – 2013-03-04 20:41:49

2

從您的意見,我認爲您正在尋找這樣的查詢:

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

它製作容器的副本,但過濾不大於2的項目

+0

後一版本的作品。第一個沒有產生任何結果。 – 2013-03-04 20:37:44

+0

@ P.Brian.Mackey沒有一個容器實際上滿足第一個版本,因爲它們都包含至少一個小於'2'的項目我認爲第二個版本或多或少是你要找的東西? – 2013-03-04 20:38:39

2

如果你並不真正需要做的是在一個單一的查詢:

var result = containers.Where(c => c.Active).ToList(); 
result.ForEach(c => c.Items.RemoveAll(i => i <= 2)); 
相關問題