使用lambda从嵌套列表中区分值

本文关键字:中区 列表 嵌套 lambda 使用 | 更新日期: 2023-09-27 17:51:12

我有一个文档列表,其中包含一个文档组列表,我想选择所有不同的文档组来执行操作。通过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);
     }
}

谢谢,莱安德罗Tavares

使用lambda从嵌套列表中区分值

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

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

你需要在DocumentGroup中覆盖GetHashCode,正如Servy所指出的那样。在本例中,这是微不足道的:

public override int GetHashCode()
{
    return DocumentGroupId;
}

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