C# 按int属性比较两个自定义对象列表

C# 按int属性比较两个自定义对象列表,c#,linq,C#,Linq,我试图通过int属性找到两个不同列表中两个对象之间的差异。我如何才能最有效地做到这一点 我有一个名为Item的类 public class Item { public string ItemNumber; public string OptionNumber; public int Count; } 我有两个项目清单——预期的和实际的 List<Item> expected = new List<Item>(); List<Item&g

我试图通过int属性找到两个不同列表中两个对象之间的差异。我如何才能最有效地做到这一点

我有一个名为Item的类

public class Item
{
    public string ItemNumber;
    public string OptionNumber;
    public int Count;
}
我有两个项目清单——预期的和实际的

List<Item> expected = new List<Item>();  
List<Item> actual = new List<Item>();
从上面的示例中,我尝试获得以下输出:

List<Item> output = new List<Item>();

output.Add(new Item() { ItemNumber = "123456", OptionNumber = "123", Count = 0 });
output.Add(new Item() { ItemNumber = "123456", OptionNumber = "126", Count = 0 });
output.Add(new Item() { ItemNumber = "112233", OptionNumber = "111", Count = -1 });
output.Add(new Item() { ItemNumber = "998877", OptionNumber = "111", Count = 1 });
output.Add(new Item() { ItemNumber = "112244", OptionNumber = "222", Count = -4 });
列表输出=新列表();
添加(新项(){ItemNumber=“123456”,OptionNumber=“123”,Count=0});
添加(新项(){ItemNumber=“123456”,OptionNumber=“126”,Count=0});
添加(新项(){ItemNumber=“112233”,OptionNumber=“111”,Count=-1});
添加(新项(){ItemNumber=“998877”,OptionNumber=“111”,Count=1});
添加(新项(){ItemNumber=“112244”,OptionNumber=“222”,Count=-4});
试试这个:

List<Item> output = expected
    .Select(x => new Item()
    {
        ItemNumber = x.ItemNumber,
        OptionNumber = x.OptionNumber,
        Count = (x.Count - (actual.FirstOrDefault(y => y.ItemNumber == x.ItemNumber
        && y.OptionNumber == x.OptionNumber)?.Count ?? 0)) * -1
    })
    .Concat(actual
        .Where(x => !expected.Any(y => y.ItemNumber == x.ItemNumber && y.OptionNumber == x.OptionNumber)))
        .Select(x => new Item()
        {
            ItemNumber = x.ItemNumber,
            OptionNumber = x.OptionNumber,
            Count = x.Count
        })
    .ToList();
列表输出=预期值
.选择(x=>newitem()
{
ItemNumber=x.ItemNumber,
OptionNumber=x.OptionNumber,
Count=(x.Count-(actual.FirstOrDefault)(y=>y.ItemNumber==x.ItemNumber
&&y.OptionNumber==x.OptionNumber)?.Count(0))*-1
})
.Concat(实际值)
.Where(x=>!应为.Any(y=>y.ItemNumber==x.ItemNumber&&y.OptionNumber==x.OptionNumber)))
.选择(x=>newitem()
{
ItemNumber=x.ItemNumber,
OptionNumber=x.OptionNumber,
计数=x.计数
})
.ToList();

它从预期的项目中减去实际的数字,并创建新的
项目
对象,其
计数
属性设置为差值。

您可以重写类中的Equals方法,或者您可以使用equalitycomparerI在linq中重写除之外的
,因为您认为预期的输出是错误的。您的实际值不包含112233,但仍有输出。代码中没有
选项
属性,只有
选项编号
。到目前为止你试过什么?
List<Item> output = expected
    .Select(x => new Item()
    {
        ItemNumber = x.ItemNumber,
        OptionNumber = x.OptionNumber,
        Count = (x.Count - (actual.FirstOrDefault(y => y.ItemNumber == x.ItemNumber
        && y.OptionNumber == x.OptionNumber)?.Count ?? 0)) * -1
    })
    .Concat(actual
        .Where(x => !expected.Any(y => y.ItemNumber == x.ItemNumber && y.OptionNumber == x.OptionNumber)))
        .Select(x => new Item()
        {
            ItemNumber = x.ItemNumber,
            OptionNumber = x.OptionNumber,
            Count = x.Count
        })
    .ToList();