我有这个代码可以正常工作:
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));
}
有更好的方法吗?
答案 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());