合并IEnumerable中的重复元素

biz*_*dee 11 .net c# linq

我现在有一个IEnumerable<MyObject>地方MyObject拥有的属性String Namelong Value.

如果我要在Enumerable中有10个实例MyObject,每个实例具有不同的名称和值,除了一个与另一个具有相同名称的实例.

.NET(或LINQ)是否有内置方法允许我找到副本,如果可能的话,合并Value属性,以便最终只有9个元素在枚举中,每个元素都有一个独特的元素Name和一个有元素的元素副本具有Value等于其自身和副本之和的副本.

到目前为止,我已经发现迭代整个过程IEnumerable并查找重复项并生成一个新IEnumerable的独特项目的唯一方法,但这似乎不整齐和缓慢.

Ser*_*kiy 17

您可以按名称和项目结果将项目分组为"合并"对象:

objects.GroupBy(o => o.Name)
       .Select(g => new MyObject { Name = g.Key, Value = g.Sum(o => o.Value) });
Run Code Online (Sandbox Code Playgroud)

更新:另一个选项,如果不希望新的MyObject实例化(例如,您在此类中有许多属性,或者您应该保留引用),那么您可以将聚合与组中的第一项一起用作累加器:

objects.GroupBy(o => o.Name)
       .Select(g => g.Skip(1).Aggregate(
                        g.First(), (a, o) => { a.Value += o.Value; return a; }));
Run Code Online (Sandbox Code Playgroud)


Vla*_*mir 7

list.GroupBy(e => e.Name).Select(group => new MyObject
    {
        Name = group.Key,
        Value = group.Sum(e => e.Value)
    }
)
Run Code Online (Sandbox Code Playgroud)

更新:
另一种变体:

list.GroupBy(
    e => e.Name,
    e => e,
    (name, group) => group.Aggregate((result, e) =>
        {
            result.Value += e.Value;
            return result;
        }
    )
)
Run Code Online (Sandbox Code Playgroud)