2011-01-26 5 views
88

IGrouping에서 "Value"속성 가져 오기

public DespatchGroup(DateTime despatchDate, List<Products> products); 

와 같은 데이터 구조가 있습니다.

var list = new List<DespatchGroup>(); 

foreach (var group in dc.GetDespatchedProducts().GroupBy(i => i.DespatchDate)) 
{ 
    // group.Values is not correct... how do I write this? 
    list.Add(new DespatchGroup(group.Key, group.Values); 
} 

실제로 데이터를 얻는 방법을 볼 수 없으므로 분명히 IGrouping을 이해하지 못합니다. 그룹 내의 기록!

+1

가 편집 [(REV2)이 (http://stackoverflow.com/revisions/4804477/2가) 매우 건설적인 아니었다 부를 수 답과 일치해라. –

답변

112

그룹은 IEnumerable<T> 구현 - 일반적으로 경우, 단지 group 이상 foreach를 호출합니다. 경우, 이후 당신은 List<T> 필요 다음 IGrouping<T> 자체 값의 IEnumerable<T> 순서 때문에

list.Add(new DespatchGroup(group.Key, group.ToList()); 
+0

기본적으로 우리가 'value'질문의 본질을 따르는 경우에는 'ToList()'와 비교할 수 있습니다. 단지 값을 꺼내는 것과 반대로 목록으로 변환하는 오버 헤드가 더 많습니다. – Coops

+1

@CodeBlend 더 많은 정보가 있습니다. 오버 헤드는 목록을 원하기 때문입니다. 상상 한 것처럼'Values' 속성이 있다면'group.Values.ToList()'를해야 할 것입니다. 반대로 목록 대신에 열거 형을 수락하면'new DespatchGroup (group.Key, group)'이 작동합니다. 오버 헤드는 IGrouping 작동 방식이 아닌'DespachGroup'의 정의에서옵니다. –

24

는 더 Values 재산 또는 유사한 없습니다. 다른 답변이 말했듯이, 그룹화는 IEnumerable을하기 때문에, 특정 액세스해야하는 경우 -

list.Add(new DespatchGroup(group.Key, group.ToList()); 
+2

'group.AsEnumerable()'을 원하면 IEnumerable로 변환 할 수도 있습니다. –

12

그냥 관련 팁 :이 경우에해야 할 모든 목록에 그 순서를 변환입니다 색인 group.ElementAt(i)을 사용할 수 있습니다.

이것은 많은 사람들에게 분명하지만 분명히 도움이 될 것입니다.

1

선택한 그룹의 경우, 당신은하지 않는

var selectedGroupValues=selectedGroup.SelectMany(x=>x);