我正在尝试比较两个对象列表,并根据它们创建一个全新的列表。
我有一个名为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();
您可以使用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();
我希望有帮助。
您可以尝试将两个列表与Concat
合并,然后使用GroupBy
按ItemNumber
和OptionNumber
属性分组。然后,我们可以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();