[英]Return min value in group with lambda/linq query
I need help creating a lambda expression to query the following list for retrieving the lowest priced item in each channel. 我需要帮助创建一个lambda表达式来查询以下列表,以便检索每个通道中价格最低的项目。 Ie for this example item A, D and G
即,对于该示例项目A,D和G.
class Radio
{
public string Name { get; set; }
public int Channel { get; set; }
public decimal Price { get; set; }
}
List<Radio> radios = new List<Radio>();
radios.Add(new Radio() { Name = "A", Channel = 1, Price = 10 });
radios.Add(new Radio() { Name = "B", Channel = 1, Price = 20 });
radios.Add(new Radio() { Name = "C", Channel = 1, Price = 30 });
radios.Add(new Radio() { Name = "D", Channel = 2, Price = 10 });
radios.Add(new Radio() { Name = "E", Channel = 2, Price = 20 });
radios.Add(new Radio() { Name = "F", Channel = 2, Price = 30 });
radios.Add(new Radio() { Name = "G", Channel = 3, Price = 10 });
radios.Add(new Radio() { Name = "H", Channel = 3, Price = 20 });
radios.Add(new Radio() { Name = "I", Channel = 3, Price = 30 });
Using Linq, 使用Linq,
First Group using Enumerable.GroupBy 第一组使用Enumerable.GroupBy
Then Sort using Enumerable.OrderBy 然后使用Enumerable.OrderBy进行排序
Then Take First of each sorted items in group 然后采取首先在组中的每个分类项
radios.GroupBy(x=> x.Channel).Select(x=>x.OrderBy(y=>y.Price)).Select(x=>x.First());
You can also do this without doing an expensive sort on each group: 您也可以在不对每个组进行昂贵的排序的情况下执行此操作:
radios.GroupBy(x => x.Channel).Select(g =>
g.Aggregate((r1, r2) => r1.Price < r2.Price ? r1 : r2));
The Aggregate
iterates through each group once, keeping track of the cheapest radio it's found so far and replacing it if it finds a cheaper one. Aggregate
遍历每个组一次,跟踪到目前为止发现的最便宜的无线电,如果找到更便宜的无线电,则替换它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.