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);
}
}
는
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
편집을 산출 산출 : ... 당신의 해명에 대응
당신이 여기에서 그것을 가져갈 수있을 것 같아요. 그룹 내에 열이 있는지 여부를 확인하려면 브루노 (Bruno)의 대답과 같은 Any
연산자가 필요합니다. Aggregate
은 실제로 합계와 같이 더 복잡한 작업을 수행하기 위해 모든 값을 실제로 방문하려는 경우에만 필요합니다 (Jon이 언급했듯이 Sum
이 해당 사례를 처리 함). 당신이 대답은 모두 같은 그룹화되고 싶어하고 그룹 내에서 당신이 중 하나를 (에 따라하는 것은 당신의 맥락에서 명확하다 GroupBy
의 결과에 행 또는 여러 Any
에 의해 행을 병합 Aggregate
를 사용하는 것을 한마디로
, 각 그룹 내에서 많은 양의 데이터가있는 경우보다 효율적입니다.)
실제로 합계를 원하십니까? null 값 중 하나가 실제로 2 인 경우 결과를 원하겠습니까? –
당신이 물건을 그룹화하는 방법을 보여주기 위해 더 나은 샘플 데이터를 제공해야합니다. –
마지막 구문에서 "null을 제외한 모든 것"에서 언급했듯이 나는 어떤 종류의 참 또는 거짓 값을 필요로합니다. 내 경우에는 null이 거짓이고 다른 것은 사실 일 것이다. –