[c#] 그룹화를 사용하여 목록에 사전 만들기

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

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());

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



답변

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

이것은 작동합니다 !!!


답변

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);


답변

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


답변

나는 여기서 주제를 약간 벗어 났지만 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

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


답변