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

这三个列表使事情变得有些困难,但并非不可能。您首先按照@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

您拥有包含离散信息的单独列表而不是包含 Student 实例的单个列表并不是很好。如果您想在此处使用 group by,您可能需要首先将集合一起压缩成一个带有三元组的单个可枚举,然后开始对该可枚举使用查询操作。

于 2012-11-02T15:36:39.737 回答
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 回答
1

我只有 C#,不是 VB。提前道歉。

让我们从创建一个具有属性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 回答