C# 使用相同的用户ID合并2个不同列表中的2行?

C# 使用相同的用户ID合并2个不同列表中的2行?,c#,linq,C#,Linq,如果我有两个不同的列表 清单1包含: 用户ID:fcec4d6c-c971-4690-90da-be8411dcf251列1:32列2:2列3:0列4:0 用户ID:783ffaa5-03ef-4883-80d2-0500ef489832 Col1:50 Col2:4 Col3:0 Col4:0 清单2包含: 用户ID:fcec4d6c-c971-4690-90da-be8411dcf251 Col1:0,Col2:0,Col3:45,Col4:50 如果我想将这些合并到列表中,那么结果将是一个

如果我有两个不同的列表

清单1包含:

用户ID:fcec4d6c-c971-4690-90da-be8411dcf251列1:32列2:2列3:0列4:0

用户ID:783ffaa5-03ef-4883-80d2-0500ef489832 Col1:50 Col2:4 Col3:0 Col4:0

清单2包含:

用户ID:fcec4d6c-c971-4690-90da-be8411dcf251 Col1:0,Col2:0,Col3:45,Col4:50

如果我想将这些合并到列表中,那么结果将是一个UserDto列表,其中包含: 用户ID:fcec4d6c-c971-4690-90da-be8411dcf251列1:32列2:2列3:34列4:50 用户ID:783ffaa5-03ef-4883-80d2-0500ef489832 Col1:50 Col2:4 Col3:0 Col4:0

一个人怎么做呢

UserDto只包含如下内容

 [JsonSchema(JsonObjectType.String, Format = "uuid")]
        public Guid UserId { get; set; }
        public int Col1 { get; set; }
        public int Col2 { get; set; }
        public int Col3 { get; set; }
        public int Col4 { get; set; }
我试过了

list1.AddRange(list2);
list1.GroupBy(e => e.UserId, (key, g) => new { User = key, Columns = g.ToList() }).ToList();
return list1;
列表1返回2个用户标识,其中fcec4d6c-c971-4690-90da-be8411dcf251现在有一个列列表,其中包含两列,一列填充了col1+col2,另一列填充了col3+col4。请注意,这些列表将包含许多这样的实例


编辑1:我应该更清楚地表明,我希望最终得到这些实例的总和。我现在收到了正确的解决方案。

选择正确的聚合函数:

var result = list1.Concat(list2)
   .GroupBy(e => e.UserId)
   .Select(g => new User 
    {
        UserId = g.Key,
        Col1 = g.Max(x => x.Col1),
        Col2 = g.Max(x => x.Col2),
        Col3 = g.Max(x => x.Col3),
        Col4 = g.Max(x => x.Col4),
    })
   .ToList();

选择合适的聚合函数:

var result = list1.Concat(list2)
   .GroupBy(e => e.UserId)
   .Select(g => new User 
    {
        UserId = g.Key,
        Col1 = g.Max(x => x.Col1),
        Col2 = g.Max(x => x.Col2),
        Col3 = g.Max(x => x.Col3),
        Col4 = g.Max(x => x.Col4),
    })
   .ToList();

您没有指定为什么不更改Col1和Col2,而是更改了Col3和Col4。是否始终要替换这两列?或者,如果它们的值为零,您是否只想替换它们?或者您想用零值替换所有列

无论如何,首先需要获取每个list1Element,其中包含所有零个或多个具有相同用户标识的list2element

每当您想用“子项目”获取“项目”时,比如学校与学生、客户与他们的订单,或List1元素及其List2元素,考虑使用其中的一个重载

作为参数keySelector,使用使其成为“其list2Element”的属性

IEnumerable列表1=。。。
IEnumerable列表2=。。。
var result=list1.GroupJoin(list2
list1User=>list1User.UserId,//从list1中的每个用户获取UserId
list2User=>list2User.UserId,//从list2中的每个用户获取UserId
//参数resultSelector:来自列表1中的每个用户,具有零个或多个
//列表2中具有相同用户ID的用户,创建一个新的
(列表1用户、列表2用户swithsameid)=>新建
{
//决定你想要什么。
//是否将所有0属性替换为相应的list2列?
Col3=(list1User.Col3!=0)?list1User.Col3:
list2UsersWithSameId.Select(list2User=>list2User.Col3)
.FirstOrDefault(),
因此,如果listUser.Col3不为零,则使用此Col3值,
否则,从零个或多个list2UsersWithSameId获取Col3并使用第一个或默认值。如果有具有相同Id的list2用户,则获得其Col3,如果没有,则获得值零

因此,只有当Col3为零时,才替换该值,并且至少有一个list2具有相同的Id。如果没有,Col3保持为零

对要替换的其他列执行相同的操作


TODO:您没有指定list2中的用户ID是唯一的。如果没有,则可能是列表项有多个具有相同用户ID的对应list2项。您必须决定使用哪个值:第一个值?最大的值?

您没有指定为什么不更改Col1和Col2,而是更改了Col3和Col4。是否始终要替换这两列?或者如果它们的值为零,您只想替换它们?或者您想用零值替换所有列

无论如何,首先需要获取每个list1Element,其中包含所有零个或多个具有相同用户标识的list2element

每当您想用“子项目”获取“项目”时,比如学校与学生、客户与他们的订单,或List1元素及其List2元素,考虑使用其中的一个重载

作为参数keySelector,使用使其成为“其list2Element”的属性

IEnumerable列表1=。。。
IEnumerable列表2=。。。
var result=list1.GroupJoin(list2
list1User=>list1User.UserId,//从list1中的每个用户获取UserId
list2User=>list2User.UserId,//从list2中的每个用户获取UserId
//参数resultSelector:来自列表1中的每个用户,具有零个或多个
//列表2中具有相同用户ID的用户,创建一个新的
(列表1用户、列表2用户swithsameid)=>新建
{
//决定你想要什么。
//是否将所有0属性替换为相应的list2列?
Col3=(list1User.Col3!=0)?list1User.Col3:
list2UsersWithSameId.Select(list2User=>list2User.Col3)
.FirstOrDefault(),
因此,如果listUser.Col3不为零,则使用此Col3值,
否则,从零个或多个list2UsersWithSameId获取Col3并使用第一个或默认值。如果有具有相同Id的list2用户,则获得其Col3,如果没有,则获得值零

因此,只有当Col3为零时,才替换该值,并且至少有一个list2具有相同的Id。如果没有,Col3保持为零

对要替换的其他列执行相同的操作


TODO:您没有指定list2中的用户ID是唯一的。如果没有指定,则可能是列表项有多个对应的list2项具有相同的用户ID。您必须决定使用哪个值:第一个值?最大的值?

仔细查看
GroupBy()
的结果。也许您会找到一种方法来
选择()
您需要的数据。请仔细查看
GroupBy()的结果。
。也许您会找到一种方法来
选择()
您想从中获取的数据。它只返回UserId:fcec4d6c-c971-4690-90da-be8411dcf251 Col1:32 Col2:2 Col3:0 Col4:0 UserId:783ffaa5-03ef-4883-80d2-0500ef489832 Col1:50 Col2:4 Col3:0 Col4:0我想让它返回UserId:fcec4d6c-c971-4690-90da-be8411dcf251 Col1:32 Col2:34 Co