2013-03-11 65 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")); 

如果删除的项目数量少于原来的数,那么我们就自己感兴趣的项目,所以选择父。

注意:这将修改原始集合,所以如果您需要多次过滤,那么这不是您正在寻找的答案。