그룹화를 사용하여 목록에 사전 만들기


106

목록에 다음 개체가 있습니다.

public class DemoClass
{
    public int GroupKey { get; set; }
    public string DemoString { get; set; }
    public object SomeOtherProperty { get; set; }
}

이제 다음 사전을 만들고 싶습니다.

Dictionary<int, List<DemoClass>>

List<DemoClass>속성별로 그룹화하고 GroupKey싶지만 이것이 어떻게 수행되는지 이해가 안 돼요.

잠시 생각한 후 다음과 같이 필요한 동작을 달성했습니다.

var groupedDemoClasses = from demoClass in mySepcialVariableWhichIsAListOfDemoClass
                            group demoClass by demoClass.GroupKey
                            into groupedDemoClass
                            select groupedDemoClass;
var neededDictionary = groupedDemoClass.ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

그러나 이것을 하나의 진술로 만드는 방법이 있습니까?

답변:


88
var groupedDemoClasses = (from demoClass in mySepcialVariableWhichIsAListOfDemoClass
                          group demoClass by demoClass.GroupKey
                          into groupedDemoClass
                          select groupedDemoClass).ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

이것은 작동합니다 !!!


198

mquander의 제안을 구체적 으로 만들기 위해 :

var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
                             .GroupBy(x => x.GroupKey)
                             .ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

물론 더 짧은 변수 이름을 사용하면 더 짧게 만들 것입니다. :)

그러나 조회 가 더 적절할 수 있다고 제안 할 수 있습니까? Lookup은 기본적으로 키에서 an까지의 사전입니다. 값이 목록으로 IEnumerable<T>실제로 필요한 경우가 아니면 ToLookup 호출을 사용하여 코드를 더 짧고 효율적으로 만듭니다 .

var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
                             .ToLookup(x => x.GroupKey);

1
나는 조회가 장기 환경에서 구축 된 사전에 비해 그다지 좋지 않다고 생각했습니다. 모든 요청에 ​​대해 신선한 결과를 구축하기 때문입니다. 제가 틀렸다면 저를 수정하십시오!
Andreas Niedermair

아니요, 전체 조회를 만듭니다. 일반적으로 ToXXX는 지연된 실행을 사용하지 않습니다.
Jon Skeet

1
(당신은 참으로 연기되는 그룹화의 생각 일 수도있다.)
존 소총

1
내가 그렇게 짓궂 지 않았다면 당신에게 투표 하겠어요. Linq로 왔고 내가 들어 본 적이없는 데이터 구조에 머물 렀습니다!
Chris McCall

2
@sasikt : 모델은 무엇이든 조회 할 수 있으며 키가 존재하지 않으면 빈 컬렉션을 얻게됩니다. 이는 종종 TryGetValue 접근 방식 인 IMO보다 더 유용합니다.
Jon Skeet

6

이미 한 줄로 만들었습니다. ToDictionary첫 번째 줄 끝에을 넣으십시오 . 더 짧게하려면 쿼리 구문 대신 기능 구성 구문을 사용하십시오.


3

나는 여기서 주제를 약간 벗어 났지만 Linq에서 사전의 사전을 만드는 방법을 찾고 있었기 때문에이 스레드에 도달했으며 여기에서 대화를 통해 답을 얻었습니다.

linq를 사용하여 다단계 사전을 만들 수 있으며 , 이는 검색 할 기준이되는 키 또는 차원이 둘 이상있는 시나리오에 유용합니다. 트릭은 다음과 같이 그룹화를 만든 다음 사전으로 변환하는 것입니다.

  Dim qry = (From acs In ActualSales _
             Group By acs.ProductID Into Group _
             Select ProductID, Months = Group.ToDictionary(Function(c) c.Period) _
            ).ToDictionary(Function(c) c.ProductID)

결과 쿼리는 다음과 같이 사용할 수 있습니다.

 If qry.ContainsKey(_ProductID) Then
      With qry(_ProductID)
          If .Months.ContainsKey(_Period) Then
             ...
          End If
      End With
 End If

이런 종류의 쿼리가 필요한 다른 사람에게 도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.