比较两个对象列表并修改属性

问题描述 投票:0回答:2

我正在尝试比较两个对象列表,并根据它们创建一个全新的列表。

我有一个名为Item的类。

public class Item
{
    public string ItemNumber;
    public string OptionNumber;
    public int Count;
}

我有两个项目列表-processingItems和currentItems。

List<Item> processedItems = new List<Item>();  
List<Item> currentItems = new List<Item>();

我想要一列处理项目。但是,如果currentItems中存在ItemNumber和OptionNumber,则我希望Count属性为两个值的总和(processedItems和currentItems中的值)。

示例期望值和实际值。

processedItems.Add(new Item() { ItemNumber = "123456", OptionNumber = "123", Count = 1 });
processedItems.Add(new Item() { ItemNumber = "123456", OptionNumber = "126", Count = 2 });
processedItems.Add(new Item() { ItemNumber = "112233", OptionNumber = "111", Count = 1 });
processedItems.Add(new Item() { ItemNumber = "112244", OptionNumber = "222", Count = 4 });

currentItems.Add(new Item() { ItemNumber = "123456", OptionNumber = "123", Count = 1 });
currentItems.Add(new Item() { ItemNumber = "123456", OptionNumber = "126", Count = 2 });
currentItems.Add(new Item() { ItemNumber = "998877", OptionNumber = "111", Count = 1 });
currentItems.Add(new Item() { ItemNumber = "112244", OptionNumber = "222", Count = 0 });

从上面的示例中,我试图获得以下输出:

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

output.Add(new Item() { ItemNumber = "123456", OptionNumber = "123", Count = 2 });
output.Add(new Item() { ItemNumber = "123456", OptionNumber = "126", Count = 4 });
output.Add(new Item() { ItemNumber = "112233", OptionNumber = "111", Count = 1 });
output.Add(new Item() { ItemNumber = "112244", OptionNumber = "222", Count = 4 });

我需要使用Concat吗?我目前有这样的东西

var output = processedItems.Select(x => new Item
{
    ItemNumber = x.ItemNumber,
    OptionValue = x.OptionValue,
    Count = x.Count + (currentItems.FirstOrDefault(y => y.ItemNumber == x.ItemNumber && y.OptionValue == x.OptionValue).Count)
}).Concat(currentItems
    .Where(x => processedItems.Any(y => y.ItemNumber == x.ItemNumber && y.OptionValue == x.OptionValue)))
    .Select(x => new Item
    {
        ItemNumber = x.ItemNumber,
        OptionValue = x.OptionValue,
        Count = x.Count
    })
    .ToList();
c# linq
2个回答
0
投票

您可以使用GroupJoin,但是您可以从processedItems中选择元素,然后仅将currentItems用于count,就像下面的代码一样:

var output = processedItems.GroupJoin(currentItems,
    prd => new { prd.ItemNumber, prd.OptionNumber }, sel => new { sel.ItemNumber, sel.OptionNumber },
    (prd, sel) => new Item { ItemNumber = prd.ItemNumber, OptionNumber = prd.OptionNumber, Count = sel.Sum(s => s.Count) + prd.Count }
    ).ToList();

我希望有帮助。


-1
投票

您可以尝试将两个列表与Concat合并,然后使用GroupByItemNumberOptionNumber属性分组。然后,我们可以Select个新项目并使用Sum计算计数总和:

var result = processedItems
    .Concat(currentItems)
    .GroupBy(x => new { x.ItemNumber, x.OptionNumber })
    .Select(grp => new Item
    {
        ItemNumber = grp.Key.ItemNumber,
        OptionNumber = grp.Key.OptionNumber,
        Count = grp.Sum(x => x.Count)
    })
    .ToList();
热门问题
推荐问题
最新问题