利用Linq对集合元素合并、去重复处理

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

今天写代码时,需要对一个数组对象中按一定规则合并、去重处理,不想再毫无新意手动写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#这般犀利,世界就更美好了 

 

 

目录
相关文章
|
3月前
集合中常见方法及遍历方式
集合中常见方法及遍历方式
30 1
|
6月前
判断两个不重复的list集合是否相等 只比较元素值 不比较顺序
判断两个不重复的list集合是否相等 只比较元素值 不比较顺序
62 0
|
12月前
442. 数组中重复的数据
442. 数组中重复的数据
|
JavaScript 前端开发 API
javascript遍历对象数组排序筛选需要的键值
javascript遍历对象数组排序筛选需要的键值
66 0
13.从入门到精通:Python 集合 集合的基本操作 1、添加元素 2、移除元素 3、计算集合元素个数 4、清空集合 5、判断元素是否在集合中存在 集合内置方法完整列表
13.从入门到精通:Python 集合 集合的基本操作 1、添加元素 2、移除元素 3、计算集合元素个数 4、清空集合 5、判断元素是否在集合中存在 集合内置方法完整列表
|
存储
返回集合中最大,最小的元素,再将元素进行排序
返回集合中最大,最小的元素,再将元素进行排序
58 0
|
JSON 数据格式 Python
一日一技:包含非hashable元素的列表如何去重并保持顺序?
一日一技:包含非hashable元素的列表如何去重并保持顺序?
108 0
|
安全 Java 编译器
删除list集合中特定元素的正确姿势
删除list集合中特定元素的正确姿势
513 0
【Groovy】集合遍历 ( 使用 for 循环遍历集合 | 使用集合的 each 方法遍历集合 | 集合的 each 方法返回值分析 )
【Groovy】集合遍历 ( 使用 for 循环遍历集合 | 使用集合的 each 方法遍历集合 | 集合的 each 方法返回值分析 )
1390 0
【Groovy】集合遍历 ( 使用 for 循环遍历集合 | 使用集合的 each 方法遍历集合 | 集合的 each 方法返回值分析 )
定义一个方法,功能是找出一个数组中第一个只重复出现2次的元素,没有则返回null。例如:数组元素为 [1,3,4,2,6,3,4,2,3],重复两次的元素为4和2,但是元素4排在2的前面,则结果返回
定义一个方法,功能是找出一个数组中第一个只重复出现2次的元素,没有则返回null。例如:数组元素为 [1,3,4,2,6,3,4,2,3],重复两次的元素为4和2,但是元素4排在2的前面,则结果返回
133 0