2012-11-06 1 views
0

내가 this thread를 통해 며칠 전이 거의 동일한 질문을하고 멋진 대답을 얻었다 - 가장 큰 교훈을 나를 위해 (옆 대답 자체)에 있었다 내 보유 데이터에 대한 사용자 정의 개체를 만듭니다. 그래서, 지금은 나에게 나의 요구 사항을 만족하는 가장 효율적인 Linq에 문을 보여 기쁘게 할 전문가를 요청할 수 있습니다, 그 일을하는 데? 다음과 같이Linq에에서 그룹화를 사용하여 (사전의) 사전 만들기 (2 부)

내 시나리오는 다음과 같습니다

가정 해 보겠습니다 I가 다음 보유 클래스 :

Public Class Class_Info 
    Public Property Teacher As String 
    Public Property Name As String 
    Public Property Sex As String 
End Class 
다음

, 나는 다른 모듈에 다음과 같은 한 가정 다음으로

Dim X as new list(of Class_Info) 

목록 엘리먼트 :

Element.Teacher:  Element.Sex:  Element.Name: 
Teacher 1   Male    Whatever Name 1 
Teacher 2   Female    Whatever Name 2 
Teacher 1   Female    Whatever Name 3 
Teacher 1   Female    Whatever Name 4 
Teacher 2   Male    Whatever Name 5 
Teacher 3   Male    Whatever Name 6 
Teacher 3   Female    Whatever Name 7 
Teacher 1   Male    Whatever Name 8 
Teacher 1   Female    Whatever Name 9 
Teacher 2   Male    Whatever Name 10 

지금, 나는 다음과 같은 값으로 다음과 같은 구조 생성한다고 가정 :

Dim dictTeacherSexName as New Dictionary(Of String, Dictionary(Of String, List(of String))) 

Dict1_Key:  Dict1_Value/Dict2_Key:   Dict2_Value: 
Teacher 1   Male        Whatever Name 1 
                Whatever Name 8 
        Female       Whatever Name 3 
                Whatever Name 4 
                Whatever Name 9 
Teacher 2 ... 

는 어떻게 만들 수를 Linq를 통해 가장 효율적인 방법인가?

감사합니다 !!!

답변

1

그것은 그러나 대신 직접 개체를 가리 수 인덱스에 의존, 지난 번과 동일합니다.

var result = X.GroupBy(i => i.Teacher) 
    .ToDictionary(g => g.Key, g => g 
     .GroupBy(i => i.Sex) 
     .ToDictionary(h => h.Key, h => h 
      .Select(i => i.Name) 
      .ToList())); 

는 또한 청소기 사용을 위해 iLookup으로이 작업을 수행 할 수 있습니다. 당신은 당신의 조회 객체로 사용자 정의 클래스를 사용할 수 있지만하여 IComparable을 구현해야합니다.

class Program 
{ 
    public static void Main() 
    { 
     var X = new List<Class_Info>(); 

     X.Add(new Class_Info { Teacher = "Teacher 1", Sex = "Male", Name = "Whatever Name 1" }); 
     X.Add(new Class_Info { Teacher = "Teacher 2", Sex = "Female", Name = "Whatever Name 2" }); 
     X.Add(new Class_Info { Teacher = "Teacher 1", Sex = "Female", Name = "Whatever Name 3" }); 
     X.Add(new Class_Info { Teacher = "Teacher 1", Sex = "Female", Name = "Whatever Name 4" }); 
     X.Add(new Class_Info { Teacher = "Teacher 2", Sex = "Male", Name = "Whatever Name 5" }); 
     X.Add(new Class_Info { Teacher = "Teacher 3", Sex = "Male", Name = "Whatever Name 6" }); 
     X.Add(new Class_Info { Teacher = "Teacher 3", Sex = "Female", Name = "Whatever Name 7" }); 
     X.Add(new Class_Info { Teacher = "Teacher 1", Sex = "Male", Name = "Whatever Name 8" }); 
     X.Add(new Class_Info { Teacher = "Teacher 1", Sex = "Female", Name = "Whatever Name 9" }); 
     X.Add(new Class_Info { Teacher = "Teacher 3", Sex = "Male", Name = "Whatever Name 10" }); 

     var result = X.ToLookup(key => new Tuple<string,string>(key.Teacher, key.Sex), value => value.Name); 

     // Name is a IEnumerable<string> of all names who have "Teacher 1" and are Male. 
     var name = result[new Tuple<string,string("Teacher 1","Male")]; 
    } 

    public class Class_Info 
    { 
     public string Teacher; 
     public string Name; 
     public string Sex; 
    } 
} 
+0

정말 완벽한 이해가 않습니다! - 감사!!! - Linq은 여전히 ​​상 전투기처럼 나를 때리고 있습니다! –

+0

자세한 예제를 가져 주셔서 감사합니다 ... 빠른 질문 - 조회가 사전보다 더 나은 기능을 제공합니까? 대신 그 대신 사용할 좋은 이유가 있습니까? 이 일을 정말 고마워! –

+1

사전은 일반적으로 키당 하나의 값만 허용하지만 사전 메서드에서는 List 을 기본 항목으로 저장합니다. ILookup은 모든 기능을 제공합니다. 'IDooktonary >'에 대해 'ILookup '을 신디케이트로 생각할 수 있습니다. –