이것은 매우 간단하지만 손실이 있습니다.이 유형의 데이터 세트를 감안할 때 :
UserInfo(name, metric, day, other_metric)
이 샘플 데이터 세트 :
joe 1 01/01/2011 5
jane 0 01/02/2011 9
john 2 01/03/2011 0
jim 3 01/04/2011 1
jean 1 01/05/2011 3
jill 2 01/06/2011 5
jeb 0 01/07/2011 3
jenn 0 01/08/2011 7
카운트가 발생하는 총 횟수와 함께 (0,1,2,3 ..) 순서로 메트릭을 나열하는 테이블을 검색하고 싶습니다. 따라서이 세트에서 다음과 같이 끝납니다.
0 3
1 2
2 2
3 1
LINQ 구문을 사용하고 있지만 그룹을 배치하고 계산할 위치에 붙어 있습니다 …. 어떤 도움?
POST 편집 : 게시 된 답변이 항상 다른 수의 레코드 하나를 반환했기 때문에 게시 된 답변을 얻을 수 없었습니다. 그러나 나는 작동하는 LINQ to SQL 예제를 만들 수있었습니다.
var pl = from r in info
orderby r.metric
group r by r.metric into grp
select new { key = grp.Key, cnt = grp.Count()};
이 결과는 나에게 ‘메트릭’과 그와 관련된 사용자 수를 가진 정렬 된 레코드 세트를 주었다. 나는 일반적으로 LINQ를 처음 접했고 훈련되지 않은 눈 에이 접근법은 순수한 LINQ 접근법과 매우 유사하지만 다른 대답을주었습니다.
답변
를 호출 GroupBy
하면 일련의 그룹 이 생성됩니다. IEnumerable<Grouping>
여기서 각 그룹 자체는 Key
그룹을 만드는 데 사용 된 IEnumerable<T>
항목을 표시하며 원래 데이터 세트에있는 항목 중 하나 입니다. Count()
소계를 얻으려면 해당 그룹화 를 호출 하면됩니다.
foreach(var line in data.GroupBy(info => info.metric)
.Select(group => new {
Metric = group.Key,
Count = group.Count()
})
.OrderBy(x => x.Metric)
{
Console.WriteLine("{0} {1}", line.Metric, line.Count);
}
이것은 매우 빠른 답변이지만 첫 번째 줄, 특히 “data.groupby (info => info.metric)”에 약간의 문제가 있습니다.
나는 당신이 이미 class
보이는 것의 목록 / 배열을 가지고 있다고 가정합니다.
class UserInfo {
string name;
int metric;
..etc..
}
...
List<UserInfo> data = ..... ;
그렇게하면 data.GroupBy(x => x.metric)
“에 x
의해 정의 된 IEnumerable의 각 요소 에 대해 data
의 값을 계산 .metric
한 다음 동일한 메트릭을 가진 모든 요소를 a 로 그룹화하고 모든 결과 그룹 중 하나 Grouping
를 반환합니다 IEnumerable
.
<DATA> | Grouping Key (x=>x.metric) |
joe 1 01/01/2011 5 | 1
jane 0 01/02/2011 9 | 0
john 2 01/03/2011 0 | 2
jim 3 01/04/2011 1 | 3
jean 1 01/05/2011 3 | 1
jill 2 01/06/2011 5 | 2
jeb 0 01/07/2011 3 | 0
jenn 0 01/08/2011 7 | 0
그룹별로 다음과 같은 결과가 나타납니다.
(Group 1): [joe 1 01/01/2011 5, jean 1 01/05/2011 3]
(Group 0): [jane 0 01/02/2011 9, jeb 0 01/07/2011 3, jenn 0 01/08/2011 7]
(Group 2): [john 2 01/03/2011 0, jill 2 01/06/2011 5]
(Group 3): [jim 3 01/04/2011 1]
답변
가정 userInfoList
은 List<UserInfo>
:
var groups = userInfoList
.GroupBy(n => n.metric)
.Select(n => new
{
MetricName = n.Key,
MetricCount = n.Count()
}
)
.OrderBy(n => n.MetricName);
에 대한 람다 함수는 GroupBy()
, n => n.metric
이 필드를 얻을 것을 의미합니다 metric
모든에서 UserInfo
발생하는 객체입니다. 의 유형은 n
컨텍스트에 따라 다릅니다 . UserInfo
목록에는 UserInfo
객체 가 포함되어 있기 때문에 첫 번째 유형은 유형 입니다. 두 번째 항목 n
의 유형은이며 Grouping
, 이제는 Grouping
객체 목록이기 때문 입니다.
Grouping
S는 확장 등의 방법이 .Count()
, .Key()
당신이 기대하는 다른 거의 아무것도. 를 확인 .Lenght
하는 것처럼 그룹을 string
확인할 수 있습니다 .Count()
.
답변
userInfos.GroupBy(userInfo => userInfo.metric)
.OrderBy(group => group.Key)
.Select(group => Tuple.Create(group.Key, group.Count()));