C# 按结果遍历分组

C# 按结果遍历分组,c#,linq,lambda,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循环和不必要的列表的方法: var group

我有这样的代码,它工作得很好:

var groupbyLinq = (from c in lst
                   group c by c.Name into g
                   from d in g
                   select d.Ave).ToList();
现在,我想在lambda中使用与上述代码等价的代码。我尝试了下面的代码,效果很好,但我正在寻找一种不使用
foreach
循环和不必要的
列表的方法:

var groupbyRcesult=lst.GroupBy(c=>c.Name);
List lstAves=新列表();
foreach(GroupByrcResult中的var项)
{
AddRange(item.Select(student=>student.Ave));
}

有更好的方法吗?

您可以使用
SelectMany

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

但是这个问题对我来说没有意义。您将按名称分组,然后展开组以选择
Ave
属性。所以你又得到了副本。但它是原始查询的方法语法版本。如果查询
lst.Select(s=>s.Ave)
没有
GroupBy+SelectMany
,唯一改变的是顺序有点随意。

您可以使用
SelectMany

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

但是这个问题对我来说没有意义。您将按名称分组,然后展开组以选择
Ave
属性。所以你又得到了副本。但它是原始查询的方法语法版本。在查询
lst.Select(s=>s.Ave)
中,如果没有
GroupBy+SelectMany
的话,唯一可以更改的是顺序,这有点随意。

同时使用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();

同时使用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();

如果希望看到语句转换为方法语法,可以执行以下操作 以下内容,用于任何查询:

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());

如果希望看到语句转换为方法语法,可以执行以下操作 以下内容,用于任何查询:

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());

谢谢我知道我又收到了复本。我只是好奇我怎么能做到。还有一个问题,我可以用更短的方式编写我的原始查询吗?或者它是完美的?您能解释一下为什么我要使用
SelectMany
。@user5032790:因为您想从每个组中的每个对象中选择
Ave
属性。一个组可以包含多个(这就是为什么您按
名称
分组)。如果要提取所有
int
,需要使用
选择many
。这会将组展平,类似于您的
AddRange(item.Select..)
SelectMany
在某种程度上是
GroupBy
的反向过程。当我使用此代码时,lst.GroupBy(c=>c.Name)。Select(c=>c.Select(d=>d.Ave)).ToList();它编译成功,但结果显示可枚举。你能告诉我这里的select和SelectMany有什么区别吗?@user5032790:如果你没有尝试将结果分配给
列表,它会编译,因为你得到了一个
列表。因此,不同之处在于
Select
返回每个组的
IEnumerable
,而
SelectMany
返回所有组的所有整数。谢谢。我知道我又收到了复本。我只是好奇我怎么能做到。还有一个问题,我可以用更短的方式编写我的原始查询吗?或者它是完美的?您能解释一下为什么我要使用
SelectMany
。@user5032790:因为您想从每个组中的每个对象中选择
Ave
属性。一个组可以包含多个(这就是为什么您按
名称
分组)。如果要提取所有
int
,需要使用
选择many
。这会将组展平,类似于您的
AddRange(item.Select..)
SelectMany
在某种程度上是
GroupBy
的反向过程。当我使用此代码时,lst.GroupBy(c=>c.Name)。Select(c=>c.Select(d=>d.Ave)).ToList();它编译成功,但结果显示可枚举。你能告诉我这里的select和SelectMany有什么区别吗?@user5032790:如果你没有尝试将结果分配给
列表,它会编译,因为你得到了一个
列表。不同之处在于,
Select
为每个组返回
IEnumerable
,而
SelectMany
返回所有组的所有整数。我希望在lambda中使用与上述代码等价的SelectMany。总之,要清楚,我想说的是,在方法语法中可以做的任何事情,也可以使用查询语法来做。因此,您可以使用查询语法,然后使用上面显示的代码将其转换为方法语法。我知道在方法语法中可以做的任何事情,我也可以使用查询语法,我自己也有查询语法,但我正在寻找我的代码的lambda版本,我发现我应该使用SelectMany。我希望在lambda是SelectMany。总之,我想说的是,在方法语法中可以做的任何事情,也可以使用查询语法来做。因此,您可以使用查询语法,然后使用上面显示的代码将其转换为方法语法。我知道,在方法语法中可以做的任何事情,我也可以使用查询语法,我自己也有查询语法,但我正在寻找我的代码的lambda版本,我发现我应该使用SelectMany。