Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用lambda将值与嵌套列表区分开来_C#_Linq_List_Lambda_Nested - Fatal编程技术网

C# 使用lambda将值与嵌套列表区分开来

C# 使用lambda将值与嵌套列表区分开来,c#,linq,list,lambda,nested,C#,Linq,List,Lambda,Nested,我有一个包含文档组列表的文档列表,我想选择所有不同的文档组来执行操作。遍历2个循环很简单,但我无法找到如何使用lambda表达式实现这一点。有人能提供一些帮助吗 这些是课程 public class Document { public int DocumentID {get; set;} public string DocumentName {get; set;} public List<DocumentGroup> DocumentGroups {

我有一个包含文档组列表的文档列表,我想选择所有不同的文档组来执行操作。遍历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;
    }
}
公共类文档
{
public int DocumentID{get;set;}
公共字符串DocumentName{get;set;}
公共列表文档组{get;set;}
}
公共类文档组:IEquatable
{
public int DocumentGroupID{get;set;}
公共字符串组名{get;set;}
公共布尔等于(文档组其他)
{
如果(其他==null)
返回false;
返回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);
     }
}
List distinctDocumentGroups=new List();
foreach(文件列表中的文件d)
{
foreach(d.DocumentGroup中的文档组dg)
{ 
如果(!distinctDocumentGroups.Contains(dg))
distinctDocumentGroups.Add(dg);
}
}
谢谢,
Leandro Tavares

我想您只需要将
[SelectMany
]组合起来(将文档列表展平为文档组序列),然后获得不同的元素:

var documentGroups = documentList.SelectMany(d => d.DocumentGroups)
                                 .Distinct()
                                 .ToList();
您还需要覆盖
DocumentGroup
中的
GetHashCode
,正如Servy所指出的那样。在这种情况下,这是微不足道的:

public override int GetHashCode()
{
    return DocumentGroupId;
}

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

实现
IEquatable
,但不要覆盖
GetHashCode
。那太糟糕了。您确实希望哈希代码实现与
Equals
的定义同步。您也不应该让
Equals(DocumentGroup other)
具有与
Equals(object other)
不同的相等定义。“这太让人困惑了。@Servy:当散列码被修复时,它会的,这大概是我的意图。它对我来说不起作用。”。结果列表中出现了多个DocumentGroup。我已经检查了IEquatable实现,它还可以。有什么想法可能会发生吗?@LeandroTavares:我相信LINQ对对象的作用比我相信你检查你的
IEquatable
实现的作用更大,恐怕。。。你现在是否已经适当地覆盖了
GetHashCode
?@JonSkeet是的,你是对的。我已经覆盖了GetHashCode的实现,现在它可以工作了!谢谢你的邀请help@Servy谢谢重写GetHashCode是非常必要的。这也是一个很好的做法!