C# 使用lambda将值与嵌套列表区分开来
我有一个包含文档组列表的文档列表,我想选择所有不同的文档组来执行操作。遍历2个循环很简单,但我无法找到如何使用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 {
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是非常必要的。这也是一个很好的做法!