【问题标题】:Merging 2 lists and sum several properties using LINQ使用 LINQ 合并 2 个列表并汇总多个属性
【发布时间】:2012-12-16 12:20:31
【问题描述】:

我有一个包含以下属性的类:

public class SomeClass()
{
public Int32 ObjectId1 {get;set;}
public Int32 ObjectId2 {get;set;}
public Int32 ActiveThickeness {get;set;}
public Int32 ActiveFilterThickness {get;set;}
}

我还有 2 个列表:

List<SomeClass> A
List<SomeClass> B

列表 A 有数据:

| ObjectId1 | ObjectId2 | ActiveThickness | ActiveFilterThickness |
-------------------------------------------------------------------
|     1     |     3     |       50        |           0           |
 ------------------------------------------------------------------
|     1     |     2     |       400       |           0           |
-------------------------------------------------------------------
|     4     |    603    |       27        |           0           |
-------------------------------------------------------------------

列表 B 有数据:

| ObjectId1 | ObjectId2 | ActiveThickness | ActiveFilterThickness |
-------------------------------------------------------------------
|     1     |     3     |       0         |         13671         |
 ------------------------------------------------------------------
|     1     |     2     |       0         |          572          |
-------------------------------------------------------------------
|    29     |    11     |       0         |         4283          |
-------------------------------------------------------------------

我想将 A 和 B(如果可能,使用 LINQ)合并到 SomeCalss 的列表 C 中,其中包含如下数据:

| ObjectId1 | ObjectId2 | ActiveThickness | ActiveFilterThickness |
-------------------------------------------------------------------
|     1     |     3     |       50        |         13671         |
 ------------------------------------------------------------------
|     1     |     2     |       400       |          572          |
-------------------------------------------------------------------
|    29     |    11     |       0         |         4283          |
-------------------------------------------------------------------
|     4     |    603    |       27        |           0           |
-------------------------------------------------------------------

我怎样才能做到这一点?

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    使用GroupBy 对常用对象进行分组,使用Sum 对所需属性进行汇总

            var ab = A.Concat(B).GroupBy(x => new
                                                  {
                                                          x.ObjectId1,
                                                          x.ObjectId2
                                                  });
    
    
            var result = ab.Select(x => new SomeClass
                                            {
                                                    ObjectId1 = x.Key.ObjectId1,
                                                    ObjectId2 = x.Key.ObjectId2,
                                                    ActiveFilterThickness = x.Sum(i => i.ActiveFilterThickness),
                                                    ActiveThickeness = x.Sum(i => i.ActiveThickeness)
                                            });
    

    【讨论】:

    • 太棒了!效果很好,非常感谢您的帮助和快速回答。
    【解决方案2】:

    LINQ - Full Outer Join (SO)。

    通过执行左外连接和右外连接,然后取这两者的并集,您应该会得到所需的结果。

    var leftOuterJoin = from someclass1 in A
                        join someclass2 in B
                        on someclass1.ObjectID2 equals someclass2.ObjectID2
                        into temp
                        from item in temp.DefaultIfEmpty(new SomeClass(){ objectID1 = someclass1.objectID1, ... })
                        select new SomeClass()
                        {
                            ...
                        };
    var rightOuterJoin = from someclass2 in B
                         join someclass1 in A
                         on someclass1.ObjectID2 equals someclass2.ObjectID2
                        into temp
                        from item in temp.DefaultIfEmpty(new SomeClass(){ objectID1 = someclass1.objectID1, ... })
                        select new SomeClass()
                        {
                            ...
                        };
    var fullOuterJoin = leftOuterJoin.Union(rightOuterJoin);
    

    【讨论】:

    • Linq 的一个问题是它缺乏一种优雅的方式来进行左、右和全外连接。
    • @juharr 是的,但在我提供的链接中,有人做了一个扩展来做完整的外部连接。你应该调查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2016-08-14
    • 2020-04-27
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    相关资源
    最近更新 更多