LINQ合并结果以行为单位

LINQ合并结果以行为单位,linq,linq-to-sql,merge,grouping,Linq,Linq To Sql,Merge,Grouping,我有一个LINQ查询,它返回一组行。结构如下: NAME, col1, col2, col3, col4 name1 1 null null null name1 null 1 null null name1 null null 1 1 因此,我希望有一行包含 name1 1 1 1 1 因此,我想按名称对这些结果进行分组,并合并(求和?)其他列,这样,如果列中的某一行中没有null,我将接收除n

我有一个LINQ查询,它返回一组行。结构如下:

NAME,    col1, col2, col3, col4
name1     1    null  null  null
name1    null   1    null  null
name1    null  null   1     1 
因此,我希望有一行包含

name1     1     1     1     1
因此,我想按名称对这些结果进行分组,并合并(求和?)其他列,这样,如果列中的某一行中没有null,我将接收除null以外的任何内容

谢谢你的帮助

public class AggregateRows
{
    class AA { public string A, B, C, D;}

    public void DoIt()
    {
        List<AA> a = new List<AA>(  ) 
        {
            new AA { A="1", B=null, C=null, D=null},
            new AA { A=null, B="1", C=null, D=null},
            new AA { A=null, B=null, C="1", D=null},
            new AA { A=null, B=null, C=null, D="1"},
        };

        var result = a.Aggregate( ( a1, a2 ) => new AA { A = a1.A ?? a2.A, B = a1.B ?? a2.B, C = a1.C ?? a2.C, D = a1.D ?? a2.D } );
        Console.WriteLine("{0}{1}{2}{3}",result.A,result.B,result.C,result.D);
    }
}

编辑:为了回应你的澄清

我想你可以从这里拿走。如果您只想确定组中是否有列,那么Bruno的答案中的
Any
操作符就是解决方法<代码>聚合仅在您试图实际访问所有值以便执行更复杂的操作(如Jon所述,
Sum
处理特定情况)时才是必要的

简言之,您想要的是在两个答案中都进行分组,然后在组内您可以使用
Aggregate
GroupBy
的结果逐行或多个
Any
进行合并,这取决于您的上下文中哪个更清晰(或者如果每个组中都有大量数据,则效率更高)

MyObj类
{
公共字符串名称{get;set;}
公共int?Col1{get;set;}
公共int?Col2{get;set;}
公共int?Col3{get;set;}
公共int?Col4{get;set;}
}
列表l=新列表{
新的MyObj{Name=“name1”,Col1=1},
新的MyObj{Name=“name1”,Col2=1},
新的MyObj{Name=“name1”,Col3=1},
新的MyObj{Name=“name1”,Col4=1}
};
var qry=从o到l
将o按o的名称分组为g
选择新的
{
名称=g.键,
Col1=g.Any(e=>e.Col1.HasValue)?(int?)1:null,
Col2=g.Any(e=>e.Col2.HasValue)?(int?)1:null,
Col3=g.Any(e=>e.Col3.HasValue)?(int?)1:null,
Col4=g.Any(e=>e.Col4.HasValue)?(int?)1:null
};

您是否真的想要求和?如果其中一个空值实际上是2,您希望结果是什么?您需要提供更好的示例数据,以显示如何对内容进行分组等。正如我在上一个短语“除空以外的任何内容”中提到的,我需要某种布尔值true或false。在我的例子中,null将为false,其他任何内容都为true。当然,您指的是Console.WriteLine(“{0}{1}{2}{3}{4}”,result.N,result.A,result.B,result.C,result.D)@melco man:是的,谢谢-更改了它(实际上我在其他地方有正确的代码,但同时在文章中编辑了这些更改,而编辑在长文章中这样做肯定没有帮助!)
1111
public class AggregateRows
{
    class AA
    {
        public string N, A, B, C, D;
    }

    public void DoIt()
    {
        List<AA> data = new List<AA>() 
        {
            new AA { N="Name", A="1", B=null, C=null, D=null},
            new AA { N="Name", A=null, B="2", C=null, D=null},
            new AA { N="Name", A=null, B=null, C="3", D=null},
            new AA { N="Name", A=null, B=null, C=null, D="4"},
            new AA { N="Name2", A="2", B=null, C=null, D=null},
            new AA { N="Name2", A=null, B="2", C=null, D=null},
            new AA { N="Name2", A=null, B=null, C="2", D=null},
            new AA { N="Name2", A=null, B=null, C=null, D="2"},
        };

        var results = data.GroupBy( a => a.N )
            .Select( k =>
            {
                var values = k.Aggregate( ( a1, a2 ) => new AA
                {
                    A = a1.A ?? a2.A,
                    B = a1.B ?? a2.B,
                    C = a1.C ?? a2.C,
                    D = a1.D ?? a2.D
                } );
                return new AA { N = k.Key, A = values.A, B = values.B, C = values.C, D = values.D };
            } );
        foreach ( var result in results )
            Console.WriteLine( "{0} {1}{2}{3}{4}", result.N, result.A, result.B, result.C, result.D );
    }
}
Name 1234
Name2 2222
class MyObj
{
    public string Name { get; set; }
    public int? Col1 { get; set; }
    public int? Col2 { get; set; }
    public int? Col3 { get; set; }
    public int? Col4 { get; set; }
}

List<MyObj> l = new List<MyObj> {
    new MyObj {Name = "name1", Col1 = 1 },
    new MyObj {Name = "name1", Col2 = 1 },
    new MyObj {Name = "name1", Col3 = 1 },
    new MyObj {Name = "name1", Col4 = 1 }
};

var qry = from o in l
          group o by o.Name into g
          select new
          {
              Name = g.Key,
              Col1 = g.Any(e => e.Col1.HasValue) ? (int?)1 : null,
              Col2 = g.Any(e => e.Col2.HasValue) ? (int?)1 : null,
              Col3 = g.Any(e => e.Col3.HasValue) ? (int?)1 : null,
              Col4 = g.Any(e => e.Col4.HasValue) ? (int?)1 : null
          };