一行搞定List中的成员出现次数的数量统计
经常遇到这么一类问题,我们要统计List<T>列表中不同值成员出现的次数。在C#中可以巧用Linq中的**GroupBy(…)**方法。
下面我们给一个例子,只需一行代码即可搞定成员出现次数的数量统计:
class MySample
{
public static void Main()
{
List<int> idList = new List<int>(){3, 5, 4, 3, 5, 6, 7, 7, 9, 0, 1, 3};
var result = idList.GroupBy(item => item,
(key, ids) => new {id = key, Cnt = ids.Count()});
foreach(var item in result)
{
Debug.WriteLine($"id:{item.id} Cnt: {item.Cnt}");
}
}
}
这段代码需要引用命名空间System.Linq。
输出结果如下:
id:3 Cnt: 3
id:5 Cnt: 2
id:4 Cnt: 1
id:6 Cnt: 1
id:7 Cnt: 2
id:9 Cnt: 1
id:0 Cnt: 1
id:1 Cnt: 1
第6-7行(实际为1行)一行代码即实现了出现不通过id的数量统计。
这里用到了委托参数,Lambda表达式,匿名类型等一系列知识点。
下面简单说明下:
既然我们要对List数据进行分组,那么需要确定"组别",Group方法的第一个参数就是要确定选择组别的方法。既然是分组,那么显然每个组别肯定是唯一的,因此官方称呼这个"组别"叫做键值;例子中item => item 这个Lambda表达式表示直接选成员本身的值作为分组的键值;当然,我们需要根据我们的实际情况选定键值,假设我们的需求是需要将id值的平方作为键值,那么Lambda表达式可以这么写:item => item*item。
除了选择,那么Group方法还直接提供了功能,就是可以给出一个"组别"对应的组的信息,至于这个信息里面携带什么内容,完全交给我们用户来定义,这就是靠Group第第二个参数来实现。
(key, ids) => new {id = key, Cnt = ids.Count()} 的这个Lambda表达式就是建立了一个匿名类型,这里的key就表示我们上面建立的键值,ids则就是已经给子分好组的List。id则是匿名类型中自定义变量,在这里等于键值,Cnt也是自定义的变量,这个变量在这里等于每个组的成员数量。