按结果迭代分组

时间:2016-05-03 08:46:59

标签: c# linq lambda

我有这个代码可以正常工作:

var groupbyLinq = (from c in lst
                   group c by c.Name into g
                   from d in g
                   select d.Ave).ToList();

现在我想要在lambda中等效上面的代码。我尝试了以下代码并且工作正常,但我正在寻找一种不使用foreach循环和不必要List<int>的方法:

var groupbyRcesult = lst.GroupBy(c => c.Name);
List<int> lstAves = new List<int>();
foreach (var item in groupbyRcesult)
{
    lstAves.AddRange(item.Select(student => student.Ave));
}

有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

您可以使用SelectMany

List<int> lstAves = lst
    .GroupBy(c => c.Name)
    .SelectMany(g => g.Select(student => student.Ave))
    .ToList();

但是查询对我来说没有意义。您按名称进行分组,然后展平组以选择Ave属性。所以你再次得到重复。但它是原始查询的方法语法版本。在没有lst.Select(s => s.Ave)的情况下从查询GroupBy+SelectMany更改的唯一内容是有点任意的顺序。

答案 1 :(得分:0)

使用linq和lambda是最好的方法。

var groupbyLinq = (from c in lst
                   group c by c.Name into g
                   select g).Select(x => new {
                      ave = x.d.Ave
                   }).ToList();

答案 2 :(得分:0)

如果您希望将语句转换为方法语法,则可以执行此操作 以下,为任何查询工作:

var groupbyLinq = (from c in lst.AsQueryable()
                   group c by c.Name into g
                   from d in g
                   select d.Ave);

Console.WriteLine(groupbyLinq.ToString());