【问题标题】:C# LINQ queries within queries and selecting groups查询中的 C# LINQ 查询和选择组
【发布时间】:2015-02-07 21:49:35
【问题描述】:

我有以下两种方法

/// <summary>
/// Reports the number of students in each ClassLevel designation
/// </summary>
/// <param name="students">The original collection of students</param>
/// <returns>A Dictionary where the key is the ClassLevel and the value is the number of students in that level</returns>
public static Dictionary<ClassLevel, int> StudentsPerClassLevel(this IEnumerable<Student> students)
{
     var query = students.GroupBy(student => student.Level).ToDictionary(x => x.Key, x => x.Count());
     return query;
}

/// <summary>
/// Determines which MaritalStatus has the highest average GPA
/// </summary>
/// <param name="students">The original collection of students</param>
/// <returns>The MaritalStatus value with the highest average GPA</returns>
public static MaritalStatus MaritalStatusWithHighestAverageGPA(this IEnumerable<Student> students)
{
        var query = students.GroupBy(s => s.Relationship).ToDictionary(x => x.Key, x => x.Average(g => g.GPA)).OrderByDescending(d => d.Value).First().Key;

        return query;
}

这些方法都不起作用,我想弄清楚我哪里出错了,我需要做什么才能达到我想要实现的目标。

有什么建议吗?

【问题讨论】:

  • 它们在哪些方面不起作用?你想达到什么目的?
  • 您的第一种方法需要GroupBy,第二种方法需要Max 函数。我需要更多地研究这些方法,以便为您提供更多帮助。
  • @JeroenVannevel 一开始我也有同样的评论,但如果你查看 XML 文档,你会发现需要什么。
  • “这些方法都不起作用”。我不相信。这意味着:他们什么都不做。您可能的意思是它们没有按预期工作,但您应该详细说明预期和实​​际结果。
  • Gert,我说它们不起作用,因为它们不会编译。期望的返回值不是方法签名期望返回的值。第一个有效,第二个无效。

标签: c# .net linq


【解决方案1】:

第一种方法应该用这个方法:https://msdn.microsoft.com/en-us/library/vstudio/bb549393(v=vs.100).aspx

类似:

return students.GroupBy(student => student.Level, (level, students) => new Tuple(level, students.Count())); 

抱歉,我无法对此进行测试,但基本上就像您的版本一样,我使用 lambda 表示按级别对所有学生进行分组。第二个 lambda 告诉方法如何处理这些组。在本例中,我为每个组创建了一个元组,其中包含每个组中学生的级别和数量。

您的返回值应更改为IEnumerable&lt;Tuple&lt;ClassLevel, int&gt;&gt;,如果您愿意,可以轻松将其转换为字典。

我无法猜测在没有编译器的情况下解决第二种方法的语法。但是这个问题使用 Max:LINQ Using Max() to select a single row

编辑 这个版本似乎至少可以编译。希望你得到了类似的结果

    public static Dictionary<ClassLevel, int> StudentsPerClassLevel(this IEnumerable<Student> students)
    {
        return students.GroupBy(student => student.ClassLevel, 
            (level, s) => new Tuple<ClassLevel, int>(level, s.Count())).ToDictionary(t => t.Item1, t => t.Item2);

    }

【讨论】:

  • 你的答案很接近,ClassLevel 是一个枚举,所以我必须在某个地方与 ClassLevel.Sophomore、ClassLevel.Junior、ClassLevel.Freshman 或 ClassLevel.Senior 的枚举进行比较。它还说“无法将 lambda 表达式转换为 Collections.Generic.IQqualityComparer 类型,因为它不是委托类型
  • var query = students.GroupBy(student => student.Level, (ClassLevel) => new Tuple(ClassLevel, students.Count()));每当我在 ClassLevel 之后放置任何内容时都会引发错误,如您的示例(级别,学生)它要求比较器,我认为它会起作用
  • 很抱歉。我现在可以访问 Visual Studio 来更详细地解决这个问题。很惊讶没有其他人回答这个问题。
  • 我想通了!谢谢,我会更新我的答案
猜你喜欢
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多