2

私はループでこれを行うことができることを知っています(実際のところ、私は現在そうですが、Linqスキルを習得/向上させようとしています。また、それがより効率的なソリューションを提供することを願っています.だから、ここに私のシナリオがあります:

次の 3 つのリストがあるとします (同様の例を作成しているだけなので、ばかげていることを許してください)。

Dim lstTeachers as New List(of string)
Dim lstStudentsSex as New List(of string)
Dim lstStudentName as New List(of string)

そして、それらは、例えば、次のとおりです。

lstTeachers:     lstStudentsSex:     lstStudentName:
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 のスキルを向上させたいので質問しています。特に、Group By と複数の Selects がまだ私を捕まえているので、助けてください。

本当にありがとう!

4

4 に答える 4

4

3 つのリストがあると少し難しくなりますが、不可能ではありません。@fsimonazzi の提案に従って最初にリストを圧縮するか、リスト エントリ自体ではなくリスト インデックスに基づいてクエリを実行します。結果は次のようになります。

(C#)

var result = Enumerable
    .Range(0, lstTeachers.Count)
    .GroupBy(i => lstTeachers[i])
    .ToDictionary(g => g.Key, g => g
        .GroupBy(i => lstStudentsSex[i])
        .ToDictionary(h => h.Key, h => h
            .Select(i => lstStudentName[i])
            .ToList()));

// result is Dictionary<string, Dictionary<string, List<string>>>
于 2012-11-02T15:43:30.863 に答える
2

これは多かれ少なかれSpenderのソリューションですが、これは機能します。

C# の場合

var dict = lstTeachers.Zip(lstStudentsSex, (teacher, sex) => new { teacher, sex })
    .Zip(lstStudentName, (x, student) => new { x.teacher, x.sex, student })
    .GroupBy(x => x.teacher)
    .ToDictionary(g => g.Key, g => g.GroupBy(x => x.sex)
        .ToDictionary(p => p.Key, p => p.Select(x => x.student)));
于 2012-11-02T16:43:51.653 に答える
2

Student インスタンスを含む 1 つのリストではなく、個別の情報を含む個別のリストを作成するのは良くありません。ここで group by を使用する場合は、最初にコレクションを 3 つ組の単一の列挙型に圧縮し、その列挙型に対してクエリ操作を使用する必要があります。

于 2012-11-02T15:36:39.737 に答える
1

VBではなくC#のみです。あらかじめお詫び申し上げます。

teacherプロパティ、sex、を持つ匿名オブジェクトの単一のリストを作成することから始めましょうname

var singleList = lstTeachers
  .Zip(lstStudentsSex, (teacher, sex) => new {teacher, sex})
  .Zip(lstStudentName, (x,name) => new {x.teacher, x.sex, name})

これを辞書の辞書に変換できます。

singleList
  .GroupBy(x => x.teacher)
  .ToDictionary(
       g => g.Key, 
       g => g.ToDictionary(x => x.sex, x => x.name))

私のコードの修正版については、@nawfal を参照してください。

于 2012-11-02T15:45:15.043 に答える