LINQ合并结果以行为单位
我有一个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
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
};