从List中的对象列表中过滤掉值

时间:2013-03-11 20:09:10

标签: performance linq entity-framework collections

我有一个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的UnitName过滤IEnumerable<UnitGroup>

例如,我想只获取包含字符串的UnitName记录并删除剩余的记录。

类似的东西:

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

使用UnitGroup下UnitType下的过滤的UnitNames获取IEnumerable<UnitGroup>

实现这一目标的最佳方式是什么?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

这是应该做@MarcinJuraszek回答的另一种方式。 (我也在猜测问题的意图。)

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

如果删除的项目数量少于原始计数,那么我们有感兴趣的项目,因此选择父项。

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

答案 2 :(得分:0)

试试这个:

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