2013-03-11 97 views
0

我有UnitGroup的IEnumerable集合:IEnumerable<UnitGroup>過濾掉從對象的列表值列表

class UnitGroup 
    {  
     string key { get; set; }    
     List<UnitType> NameList { get; set; } 
    } 
class UnitType 
    {    
     String UnitName{ get; set; } 
     Description { get; set; } 
    } 

現在我想根據UNITTYPE的單位名過濾IEnumerable<UnitGroup>

例如,我想只獲取包含字符串的UnitName記錄並刪除剩餘的。

是這樣的:

IEnumerable<UnitGroup> Groups; 
IEnumerable<UnitGroup> filteredResult = Groups.NameList(o => o.UnitName.contains("test")); 

並獲得IEnumerable<UnitGroup>與UnitGroup下UNITTYPE下只過濾UnitNames。

實現這個目標的最佳方法是什麼?

回答

2

我不是100%確定你要達到的目標。你能否提供一些樣本數據,使其更清楚?

雖然,我認爲它可能適合你的目標:

IEnumerable<UnitGroup> Groups; 
var filteredResult = Groups.Select(g => new UnitGroup { 
              key = g.key, 
              NameList = g.NameList 
                 .Where(n => n.UnitName == "test") 
                 .ToList() 
             }) 
          .Where(g => g.NameList.Count > 0); 
0

試試這個:

var filteredList = from g in Groups 
        where g.NameList.Exists(i=>i.UnitName=="test") 
        select g; 
+1

'FindAll()'返回一個不是布爾的列表。 '任何()'都會做我認爲你在這裏做的事情。 – 2013-03-11 20:30:01

+0

@Brent:OP要求IEnumerable 由FindAll()返回:「並獲得IEnumerable ,UnitGroup下的UnitType下只有過濾的UnitNames」。 – 2013-03-11 20:46:48

+1

是的,但where子句期望結果是一個布爾,而不是一個列表。 – 2013-03-11 20:59:46

1

這裏是另一種方式,應該做些什麼@MarcinJuraszek答案呢。 (我猜這個問題的意圖也是如此。)

IEnumerable<UnitGroup> Groups; 
var filteredResult = Groups.Where (g => g.NameList.Count() > g.NameList.RemoveAll(nl => nl.UnitName != "Name1")); 

如果刪除的項目數量少於原來的數,那麼我們就自己感興趣的項目,所以選擇父。

注意:這將修改原始集合,所以如果您需要多次過濾,那麼這不是您正在尋找的答案。