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)