여러 필드를 그룹별 및 합계로 선택합니다.
linq(객체 목록)로 쿼리를 하고 싶은데 어떻게 하는지 정말 모르겠어요, 그룹과 합은 할 수 있지만 나머지 필드는 선택할 수 없어요.예:
ID Value Name Category
1 5 Name1 Category1
1 7 Name1 Category1
2 1 Name2 Category2
3 6 Name3 Category3
3 2 Name3 Category3
ID별, SUM별 값별로 그룹화해서 이와 같은 모든 필드를 반환하고 싶습니다.
ID Value Name Category
1 12 Name1 Category1
2 1 Name2 Category2
3 8 Name3 Category3
업데이트됨 : 모든 필드에 대한 그룹화를 피하고자 하는 경우 다음과 같이 그룹화할 수 있습니다.Id
:
data.GroupBy(d => d.Id)
.Select(
g => new
{
Key = g.Key,
Value = g.Sum(s => s.Value),
Name = g.First().Name,
Category = g.First().Category
});
하지만 이 법전은 각각의 경우Id
, 같은Name
그리고.Category
적용합니다. 그렇다면 @Aron이 제안하는 대로 정규화하는 것을 고려해야 합니다.그것은 우리가 그들을Id
그리고.Value
한 반에서 움직이며Name
,Category
(그리고 동일한 분야에 대해 다른 분야도 동일합니다.Id
) 다른 클래스로, 또한Id
참고로정규화 프로세스를 통해 데이터 중복성과 의존성이 줄어듭니다.
void Main()
{
//Me being lazy in init
var foos = new []
{
new Foo { Id = 1, Value = 5},
new Foo { Id = 1, Value = 7},
new Foo { Id = 2, Value = 1},
new Foo { Id = 3, Value = 6},
new Foo { Id = 3, Value = 2},
};
foreach(var x in foos)
{
x.Name = "Name" + x.Id;
x.Category = "Category" + x.Id;
}
//end init.
var result = from x in foos
group x.Value by new { x.Id, x.Name, x.Category}
into g
select new { g.Key.Id, g.Key.Name, g.Key.Category, Value = g.Sum()};
Console.WriteLine(result);
}
// Define other methods and classes here
public class Foo
{
public int Id {get;set;}
public int Value {get;set;}
public string Name {get;set;}
public string Category {get;set;}
}
수업 시간이 정말 길고 모든 내용을 복사하고 싶지 않다면 다음과 같은 방법을 사용해 볼 수 있습니다.
l.GroupBy(x => x.id).
Select(x => {
var ret = x.First();
ret.value = x.Sum(xt => xt.value);
return ret;
}).ToList();
큰 힘을 가지면 큰 책임감이 생깁니다.조심해야 돼요.선ret.value = x.Sum(xt => xt.value)
새 개체가 아닌 참조를 전달할 때 원래 컬렉션이 변경됩니다.피하려면, 몇 가지를 추가해야 합니다.Clone
당신의 수업에 방법은 다음과 같습니다.MemberwiseClone
(그러나 다시 말하지만, 이는 얕은 복사를 생성하므로 주의해야 합니다.)그 다음 줄을 다음과 같이 바꿉니다.var ret = x.First().Clone();
시도해 보십시오.
var objList = new List<SampleObject>();
objList.Add(new SampleObject() { ID = 1, Value = 5, Name = "Name1", Category = "Catergory1"});
objList.Add(new SampleObject() { ID = 1, Value = 7, Name = "Name1", Category = "Catergory1"});
objList.Add(new SampleObject() { ID = 2, Value = 1, Name = "Name2", Category = "Catergory2"});
objList.Add(new SampleObject() { ID = 3, Value = 6, Name = "Name3", Category = "Catergory3"});
objList.Add(new SampleObject() { ID = 3, Value = 2, Name = "Name3", Category = "Catergory3"});
var newList = from val in objList
group val by new { val.ID, val.Name, val.Category } into grouped
select new SampleObject() { ID = grouped.ID, Value = grouped.Sum(), Name = grouped.Name, Category = grouped.Category };
LINQPad에 확인하는 방법:
newList.Dump();
언급URL : https://stackoverflow.com/questions/16100900/select-multiple-fields-group-by-and-sum
'programing' 카테고리의 다른 글
자식 값을 기준으로 요소를 선택하는 XPath (0) | 2023.10.08 |
---|---|
jQuery를 사용하는 a의 내용을 얻으려면 어떻게 해야 합니까? (0) | 2023.10.08 |
오류: "선택기가 구현되지 않음" (0) | 2023.10.08 |
C 또는 C++에 경량 멀티파트/폼 데이터 파서가 있습니까? (0) | 2023.10.03 |
nginx: 모든 요청을 단일 html 페이지로 보냅니다. (0) | 2023.10.03 |