zoukankan      html  css  js  c++  java
  • 利用Linq对集合元素合并、去重复处理,多个值进行分组

    1、对集合元素合并、去重复处理

     /// <summary>
        /// 商品
        /// </summary>
        public class GoodsInfo
        {
            /// <summary>
            /// 编号
            /// </summary>
            public string GoodsNO { get; set; }
            /// <summary>
            /// 数量
            /// </summary>
            public decimal GoodsNum { get; set; }
            /// </summary>
            /// 描述
            /// </summary>
            public string Desc { get; set; }
            /// </summary>
            /// 描述
            /// </summary>
            public string Other{get;set;}
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                List<GoodsInfo> list = new List<GoodsInfo>();
                list.Add(new GoodsInfo() { GoodsNO = "NO.01", GoodsNum = 3,Desc="test1",Other="xx"});
                list.Add(new GoodsInfo() { GoodsNO = "NO.02", GoodsNum = 1,Desc="test2",Other="xx"});
                list.Add(new GoodsInfo() { GoodsNO = "NO.01", GoodsNum = 2,Desc="test3",Other="xx"});
                list.Add(new GoodsInfo() { GoodsNO = "NO.03", GoodsNum = 4,Desc="test4",Other="xx"});
                list.Add(new GoodsInfo() { GoodsNO = "NO.02", GoodsNum = 2,Desc="test5",Other="xx"});
                
                /* 
                var s = from p in list
                             group p by p.GoodsNO into g
                             select new
                             {
                                 GoodsNO = g.Key,//对于多关键字 {GoodsNO,Desc},如可从g.Key.GoodsNo,Desc=g.key.Desc
                                 GoodsNum = g.Sum(x => x.GoodsNum),
                                 Other=g.First().Other,
                                 Desc=string.Join(",", g.Select(t => t.Desc).ToList())
                             };
                */
                 var result=list.GroupBy(p => p.GoodsNO ).Select(g => new GoodsInfo { GoodsNO = g.Key,
                                 GoodsNum = g.Sum(x => x.GoodsNum),//此注意精度问题,可Math.Round(g.Sum(x => x.GoodsNum,2)
    ) Other = g.First().Other, Desc = string.Join(",", g.Select(t => t.Desc).ToList())}); result.ToList().ForEach(x => Console.WriteLine(x.GoodsNO + " " + x.GoodsNum + " " + x.Desc +" " +x.Other)); } }

    输出结果:

    NO.01 5 test1,test3 xx
    NO.02 3 test2,test5 xx
    NO.03 4 test4 xx

    对于 GoodsInfo 有很多字段的情况,需手动写类似 Other=g.First().Other,不知有没有其他方法?

    参考引用:

    https://blog.csdn.net/qq_24432127/article/details/82789138

    https://www.cnblogs.com/yjmyzz/archive/2012/12/18/2823170.html

    2、Linq 中按照多个值进行分组(GroupBy)

     
    .GroupBy(x => new { x.Age, x.Sex })
    
    group emp by new { emp.Age, emp.Sex } into g
    
    
    // 实现多key分组的扩展函数版本
    var sums = empList
             .GroupBy(x => new { x.Age, x.Sex })
             .Select(group => new {
                Peo = group.Key, Count = group.Count()
             });
    foreach (var employee in sums) {
       Console.WriteLine(employee.Count + ": " + employee.Peo);
    }
    
    // 实现多key分组的lambda版本
    var sums2 = from emp in empList
                group emp by new { emp.Age, emp.Sex } into g
                select new { Peo = g.Key, Count = g.Count() };
    foreach (var employee in sums) {
       Console.WriteLine(employee.Count + ": " + employee.Peo);
    }
    

      

    转自 http://www.cnblogs.com/beginor/archive/2009/04/24/1442939.html
    https://www.cnblogs.com/IT-Bear/archive/2013/07/25/3214512.html

    https://www.cnblogs.com/IT-Bear/archive/2013/07/25/3214512.html

  • 相关阅读:
    VS Code 隐藏 .meta 文件
    CentOS7安装之后无法上网
    windows通过ssh方式访问CentOS7
    解决libc.so.6: version `GLIBC_2.18' not found问题
    Node.js ArrayBuffer 转为字符串
    centos7 tar, zip 解压文件命令(tar, zip)
    CentOS7安装 clang
    CentOS7开启 ssh 22端口
    MongoDB手册
    C++回调函数
  • 原文地址:https://www.cnblogs.com/venje/p/11573495.html
Copyright © 2011-2022 走看看