一行搞定List<T>中的成员数量统计

一行搞定List中的成员出现次数的数量统计

经常遇到这么一类问题,我们要统计List列表中不同值成员出现的次数。在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也是自定义的变量,这个变量在这里等于每个组的成员数量。

你可能感兴趣的:(c#,.net,core,List,C#,数量统计)