C# 用于比较具有复杂实体的两个列表的LINQ
我们的班级结构如下所示C# 用于比较具有复杂实体的两个列表的LINQ,c#,linq,C#,Linq,我们的班级结构如下所示 public class ItemDTO { public int ItemID { get; set; } } public class CostPageDTO { public string CostPageNumber { get; set; } public List<ItemDTO> Items { get; set; } } 这将选择您的预期结果: 方法语法: var result = selectedCostPage
public class ItemDTO
{
public int ItemID { get; set; }
}
public class CostPageDTO
{
public string CostPageNumber { get; set; }
public List<ItemDTO> Items { get; set; }
}
这将选择您的预期结果: 方法语法:
var result = selectedCostPageAndItems.SelectMany(scp => actualItems.Where(acp=>acp.CostPageNumber == scp.CostPageNumber),
(scp,acp)=> new {CostPageNumber = scp.CostPageNumber,
scpItems = new HashSet<int>(scp.Items.Select(x=>x.ItemID)),
acpItems = new HashSet<int>(acp.Items.Select(x=>x.ItemID))})
.Where(x => x.scpItems.SetEquals(x.acpItems))
.Select(x => x.CostPageNumber);
var result = from cp1 in selectedCostPageAndItems
from cp2 in actualItems
let items1 = new HashSet<int>(cp1.Items.Select(x=>x.ItemID))
let items2 = new HashSet<int>(cp2.Items.Select(x=>x.ItemID))
where cp1.CostPageNumber == cp2.CostPageNumber
&& items1.SetEquals(items2)
select cp1.CostPageNumber;
对于每一对(scp
和acp
),为所选(scpItems
)和实际(acpItems
)选择CostPageNumber
和一组ItemDTO.ItemID
)和CostPageDTO
(scp,acp)=> new {CostPageNumber = scp.CostPageNumber,
scpItems = new HashSet<int>(scp.Items.Select(x=>x.ItemID)),
acpItems = new HashSet<int>(acp.Items.Select(x=>x.ItemID))})
创建和比较都是O(n)
selectedCostPageAndItems.SelectMany(scp => actualItems.Where(acp=>acp.CostPageNumber == scp.CostPageNumber)
(scp,acp)=> new {CostPageNumber = scp.CostPageNumber,
scpItems = new HashSet<int>(scp.Items.Select(x=>x.ItemID)),
acpItems = new HashSet<int>(acp.Items.Select(x=>x.ItemID))})
Where(x => x.scpItems.SetEquals(x.acpItems)).Select(x => x.CostPageNumber)