首页 > 解决方案 > 合并来自具有相同 UserId 的 2 个不同列表的 2 行?

问题描述

如果我有 2 个不同的列表,

list1 包含:

用户 ID:fcec4d6c-c971-4690-90da-be8411dcf251 Col1:32 Col2:2 Col3:0 Col4:0

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

list2 包含:

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

如果我想将这些合并到列表中,那么结果将最终成为一个 UserDto 列表,其中包含: UserId: fcec4d6c-c971-4690-90da-be8411dcf251 Col1: 32 Col2: 2 Col3: 34 Col4: 50 UserId: 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;

list1 返回 2 个 UserId,其中 fcec4d6c-c971-4690-90da-be8411dcf251 现在有一个包含 2 列的 Columns 列表,其中一个填充了 col1 + col2 和 col3 + col4。请注意,这些列表将包含大量此类实例。

编辑1:我应该更清楚地表明我最终想要这些实例的总和。我现在已经收到了一个合适的解决方案。

标签: c#linq

解决方案


选择合适的聚合函数:

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();

推荐阅读