起初如果不会直接使用Group的方法,可能会使用一堆的for循环遍历每一个元素,然后使用排重,排重完成后进行排序。这样不仅写法比较麻烦,而且效率比较低
下面整理两种针对List集合的常见方法:
①使用IGrouping
按照年份对订单进行分组,得到有订单的所有年份,便可以使用如下方法。
List years = new List();
foreach (IGrouping group in OrderList.GroupBy(x => x.Year).OrderByDescending(x => x.Key))
{
years.Add(group.Key);
//foreach (OrderItem item in group.OrderBy(a => a.Year))
//{
// years.Add(item.Year);
//}
}
步骤一:通过GroupBy对List集合进行分组
步骤二:遍历GroupBy得到【IEnumerable>】公开枚举器
步骤三:遍历公开枚举器得到每一个分组,其中group.Key就是所属分组的分组项,这里就是指对应的分组后的年份
②使用lambda表达式
List years = OrderList.GroupBy(p => p.Year).OrderByDescending(p => p.Key).Select(p => p.Key).ToList();
这种方法表达起来就相对更加简单,实际上同上一种写法原理是一样的,只不过表达方式稍微有所不同。
在这里进行一点点的扩展,有的同学可能会用到,那就是在排序、分组后在最后的Select过程中做一点小动作如下:
OrderList.GroupBy(p => p.Year).OrderByDescending(p => p.Key).Select(h => new { year=h.Key,count=h.Count() }).ToList();
加粗部分就是我们进行的简单改造,这里通过Select,在其中构造了一个新的对象
在msdn中是这么解释的,“将序列中的每个元素投影到新表单中”。