使用lambda的嵌套列表中的不同值

时间:2014-03-21 15:26:39

标签: c# linq list lambda nested

我有一个包含DocumentGroups列表的Documents列表,我想选择所有不同的DocumentGroup来执行操作。迭代2个循环是微不足道的,但我无法通过lambda表达式找到如何做到这一点。有人可以提供一些帮助吗?

这些是

public class Document
{
     public int DocumentID {get; set;}

     public string DocumentName {get; set;}

     public List<DocumentGroup> DocumentGroups { get; set; }
}

public class DocumentGroup : IEquatable<DocumentGroup>
{
    public int DocumentGroupID { get; set; }

    public string GroupName { get; set; }

    public bool Equals(DocumentGroup other)
    {
        if (other == null)
            return false;

        return other.DocumentGroupID == this.DocumentGroupID;
    }
}

这是简单的代码

List<DocumentGroup> distinctDocumentGroups = new List<DocumentGroup>();

foreach (Document d in documentList)
{
     foreach(DocumentGroup dg in d.DocumentGroups)
     { 
         if (!distinctDocumentGroups.Contains(dg))
             distinctDocumentGroups.Add(dg);
     }
}

谢谢, Leandro Tavares

1 个答案:

答案 0 :(得分:2)

我怀疑您只想要[SelectMany] 1的组合(将文档列表展平为文档组序列),然后Distinct以获取不同的元素:

var documentGroups = documentList.SelectMany(d => d.DocumentGroups)
                                 .Distinct()
                                 .ToList();

如同Servy所述,您还需要覆盖GetHashCode中的DocumentGroup。在这种情况下,这是微不足道的:

public override int GetHashCode()
{
    return DocumentGroupId;
}

另请注意,让DocumentGroupId 可变成为平等关键是令人担忧的。如果可以,将其更改为不可变,并将ID传递给构造函数。