使用Linq的GroupBy()
方法,返回IEnumerable<IGrouping<TKey, TElement>>
类型
此时,我想在方法调用语法中使用Select()
返回一个匹配TElement
到TKey
的匿名类型。
这是我们在这个问题中使用的数据。
public class Pet
{
public string Name { get; set; }
public int Age { get; set; }
}
List<Pet> pets = new List<Pet>
{
new Pet { Name="Barley", Age=8 },
new Pet { Name="Boots", Age=4 },
new Pet { Name="Whiskers", Age=1 },
new Pet { Name="Daisy", Age=4 }
};
我可以通过在下面的methodCallSyntax
中嵌套foreach
来实现我想要的。
var methodCallSyntax = pets.GroupBy(pet => pet.Age, pet => pet.Name);
foreach (var grouping in methodCallSyntax)
{
foreach (var element in grouping)
{
Console.WriteLine($"Key: {grouping.Key}, Element: {element}");
}
}
但是我只想使用一次foreach
。
var methodCallSyntax =
pets
.GroupBy(pet => pet.Age, pet => pet.Name)
// .Select(grouping => new {grouping.Key, Element = grouping.});
foreach (var item in methodCallSyntax)
{
Console.WriteLine($"Key: {item.Key}, Element: {item.Element}");
}
但是正如你所看到的,我不知道该怎么填写Select()
。
我该怎么做?
可以在GroupBy之后使用SelectMany,并在SelectMany中使用Select。
SelectMany将多维集合转换为单个序列。内部Select将返回一个集合,而SelectMany将把Select中的所有值转换成一个集合。
var all = pets
.GroupBy(pet => pet.Age, pet => pet.Name)
.SelectMany(group => group
.Select(name => new { key = group.Key, value = name })
);
使用
foreach (var item in all)
{
Console.WriteLine($"Key: {item.key}, Element: {item.value}");
}