zoukankan      html  css  js  c++  java
  • 利用Linq对集合元素合并、去重复处理

    今天写代码时,需要对一个数组对象中按一定规则合并、去重处理,不想再毫无新意手动写For循环遍历(天天写一样的代码很没劲),于是依旧linq,发现真心方便:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace LinqTest
    {
        class Program
        {
    
            static void Main()
            {
                List<Product> listProduct = new List<Product> {
                        new Product{StockNum=1,ProductNo="01",Tag="a"},
                        new Product{StockNum=2,ProductNo="01",Tag="b"},
                        new Product{StockNum=3,ProductNo="02",Tag="c"},
                        new Product{StockNum=4,ProductNo="02",Tag="d"},
                        new Product{StockNum=5,ProductNo="03",Tag="e"},
                    };
    
                //注:处理目标->将"编号(ProductNo)"相同的产品记录,"库存量(StockNum)"合并,"附属标签(Tag)"合并
    
                //合并处理
                listProduct.ForEach(c => {
                    var group = listProduct.Where(a => a.ProductNo == c.ProductNo);
                    c.StockNum = group.Sum(x => x.StockNum);
                    c.Tag = group.Select(t => t.Tag).ToList().Join();
                });
    
                //去重复
                listProduct = listProduct.Distinct(new ProductNoComparer()).ToList();
    
                //输出验证
                listProduct.ForEach(c =>
                {
                    Console.WriteLine("ProductNo={0},StockNum={1},Tag={2}", c.ProductNo, c.StockNum, c.Tag);
                });  
            
                //输出结果:
                //ProductNo=01,StockNum=3,Tag=a,b
                //ProductNo=02,StockNum=7,Tag=c,d
                //ProductNo=03,StockNum=5,Tag=e
    
                Console.Read();
            }
    
    
    
    
        }
    
        /// <summary>
        /// 工具类(一般开发中,可定义在自己的工具类库里)
        /// </summary>
        static class Utils {
    
            /// <summary>
            /// List扩展方法,将List元素用分隔符连接后,返回字符串
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="list"></param>
            /// <param name="splitStr"></param>
            /// <returns></returns>
            public static String Join<T>(this List<T> list, string splitStr=",")
            {
                string result = string.Empty;
                foreach (var item in list)
                {
                    result += item.ToString() + splitStr;
                }
                return result.Trim(splitStr.ToCharArray());
            }
        }
    
        /// <summary>
        /// 产品实体类
        /// </summary>
        class Product
        {
            /// <summary>
            /// 库存
            /// </summary>
            public int StockNum { set; get; }
            
            /// <summary>
            /// 产品编号
            /// </summary>
            public String ProductNo { set; get; }
            
            /// <summary>
            /// 附属标签
            /// </summary>
            public String Tag { set; get; }
        }
    
        /// <summary>
        /// 去"重复"时候的比较器(只要ProductNo相同,即认为是相同记录)
        /// </summary>
        class ProductNoComparer : IEqualityComparer<Product>
        {
            public bool Equals(Product p1, Product p2)
            {
                if (p1 == null)
                    return p2 == null;
                return p1.ProductNo == p2.ProductNo;
            }
    
            public int GetHashCode(Product p)
            {
                if (p == null)
                    return 0;
                return p.ProductNo.GetHashCode();
            }
        }
    }
    

    其它编程语言如果都象C#这般犀利,世界就更美好了 

  • 相关阅读:
    egret-使用URLLoader 设置不同的dataFormat 加载不同的资源
    egret新手指南--自定义组件
    事件的三个阶段
    事件派发,事件机制
    屏幕适配
    断线重连机制
    电影屏幕字从天上掉下来的效果
    使用select2 实现select多选与初始化数据。
    ul高度为0 li高度为0
    php生成json文件,以zip压缩包批量下载。
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/2823170.html
Copyright © 2011-2022 走看看