3 回答

TA贡献1796条经验 获得超7个赞
这是一种方法:
反转
QTY
List2 上的值将上述结果与 List1 连接起来。
按
Material
和对串联列表进行分组Batch
,并对QTY
值求和
这是代码:
var result = List1.Concat(
List2.Select(list2Item => new List_Data
{
Material = list2Item.Material,
Batch = list2Item.Batch,
QTY = list2Item.QTY * -1
}))
.GroupBy(item => new { item.Material, item.Batch })
.Select(grouped => new List_Data
{
Material = grouped.First().Material,
Batch = grouped.First().Batch,
QTY = grouped.Sum(item => item.QTY)
})
.ToList();
即使你有 null QTY,它仍然可以工作。例如,具有这些值:
List<List_Data> List1 = new List<List_Data>();
List1.Add(new List_Data { Material = "1", Batch = "B1", QTY = 5 });
List1.Add(new List_Data { Material = "1", Batch = "B2", QTY = 5 });
List1.Add(new List_Data { Material = "2", Batch = "B1", QTY = 15 });
List1.Add(new List_Data { Material = "3", Batch = "B1", QTY = null });
List1.Add(new List_Data { Material = "3", Batch = "B3", QTY = 4 });
List<List_Data> List2 = new List<List_Data>();
List2.Add(new List_Data { Material = "1", Batch = "B1", QTY = 2 });
List2.Add(new List_Data { Material = "3", Batch = "B1", QTY = 5 });
List2.Add(new List_Data { Material = "3", Batch = "B2", QTY = 15 });
List2.Add(new List_Data { Material = "3", Batch = "B3", QTY = null });
将导致:
Material: "1", Batch: "B1", QTY: 3
Material: "1", Batch: "B2", QTY: 5
Material: "2", Batch: "B1", QTY: 15
Material: "3", Batch: "B1", QTY: -5
Material: "3", Batch: "B3", QTY: 4
Material: "3", Batch: "B2", QTY: -15

TA贡献1816条经验 获得超6个赞
如果我们假设在第二个列表中最多(如果有的话)一个具有相同Material和Bacth值的元素,那么一个简单的解决方案可能如下:
// Initially project each element in the list to an element that
// has also the info in which list this item is contained.
var list1 = List1.Select(x => new {Data = x, List = 1});
var list2 = List2.Select(x => new {Data = x, List = 2});
var result = list1.Concat(list2)
.GroupBy(x => new {x.Data.Batch, x.Data.Material})
.Select(gr =>
{
var itemsInGroup = gr.Count();
if (itemsInGroup == 1)
{
var onlyItemInGroup = gr.First();
if (onlyItemInGroup.List == 1)
{
return onlyItemInGroup.Data;
}
// Item came from the second list. So multiply it's quantity by -1.
onlyItemInGroup.Data.QTY *= -1;
return onlyItemInGroup.Data;
}
// Since for each item in list 1 there is at most one item in the list2
// and vice versa itemsInGroup now is 2 and it is safe to use First as below
// to grab the items.
var itemFromFirstList = gr.First(x => x.List == 1);
var itemFromSecondList = gr.First(x => x.List == 2);
return new List_Data
{
Material = gr.Key.Material,
Batch = gr.Key.Batch,
QTY = itemFromFirstList.Data.QTY - itemFromSecondList.Data.QTY
};
}).ToList();
Select在我们连接两个列表并根据键Material和对结果列表中的项目进行分组之后,基本上所有工作都在内部完成Batch。我们基于最初假设的选项如下:
该组仅包含一个项目,该项目来自第一个列表。在这种情况下,我们只返回该项包含的数据。
该组仅包含一个项目,该项目来自第二个列表。在这种情况下,我们必须将该值乘以
QTY
-1。请记住,您要使用的类型是list1.QTY - list2.QTY
并且在第一个列表中没有任何关联元素,list1
。所以你想得到-list2.QTY
你所声明的。该组包含两个项目,因为我们假设一个列表中最多(如果有的话)一个关联元素用于另一个列表中的另一个元素。在这种情况下,我们只需减去
list2.QTY
fromlist1.QTY
即可获得新数量。

TA贡献1789条经验 获得超10个赞
这里另一种解决方案
var result = List1
.Select(e => new
{
key = new
{
e.Material,
e.Batch
},
QTY = e.QTY
})
.Concat(List2
.Select(e => new
{
key = new
{
e.Material,
e.Batch
},
QTY = -e.QTY
}))
.GroupBy( e => e.key, e => e.QTY )
.Select(g => new Report_Class
{
Material = g.Key.Material,
Batch = g.Key.Batch,
Difference = g.Sum()
})
.ToList();
- 3 回答
- 0 关注
- 162 浏览
添加回答
举报