利用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#这般犀利,世界就更美好了 

 

 

时间: 2024-12-22 02:35:39

利用Linq对集合元素合并、去重复处理的相关文章

php二维数组合并及去重复的方法_php技巧

本文实例讲述了php二维数组合并及去重复的方法.分享给大家供大家参考.具体实现方法如下: $arr = array_merge($labels,$label); //合并需要合并的俩个数组 $key = id;//去重条件 $tmp_arr = array();//声明数组 foreach($arr as $k => $v) { if(in_array($v[$key], $tmp_arr)) //搜索$v[$key]是否在$tmp_arr数组中存在,若存在返回true { unset($arr

请问C#如何创建访问集合元素的表达式?是用linq动态创建的。

问题描述 如何创建访问集合元素的表达式?是用linq动态创建的.比如Expression.Constant(3);可以创建一个常量3,用Expression.ArrayAccess可以访问数组元素.但对于集合的元素如何访问呢?比如DataTable.Rows["element1"]=1;这样的表达式该如何创建呢,谢谢 解决方案 解决方案二:用Expression.MakeIndex解决方案三:引用1楼caozhy的回复: 用Expression.MakeIndex 你好,能不能举个例子

测试listBox1.Items.Remove方法是利用ToString还是利用gethashCode来定位元素的

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 using System; using Sy

list集合的合并的问题

问题描述 list集合的合并的问题 一个集合list1 另一个集合list2 如何将它合并成 这个样子呀?谢谢啦 账号没分了,谢谢各位啦 解决方案 首先,你这个List1的元素是一个包含日期.点击量的对象,List2是包含日期.注册的对象对吧? 其次,你可以提供一个根据日期比较对象的方法,比较这两个对象是否相同,如果相同就合并. 最后,就是遍历,比较并合并.如果就java实现就类似: 可以将List元素定义为一个类:日期.点击量.注册量,并且实现comparable接口如果日期equal相同就返

equals-Arraylist 去重复时编写去重方法没有运行找不到错误在哪?求大神帮看一下

问题描述 Arraylist 去重复时编写去重方法没有运行找不到错误在哪?求大神帮看一下 class Person { private String name; private int age; Person (String nameint age) { this.name = name; this.age =age; } public void setName(String name) { this.name = name; } public void setAge(int age) { th

传播战术:优衣库怎样利用数字营销三元素

导读:所有的企业--不止是是服装零售,都想知道:关于线上线下,优衣库是怎么想.又是怎么做的?优衣库如何做O2O"1+1>2"? 当我们谈到"优衣库",我们要谈什么?零库存.基本款.数据化管理.旗舰店.快时尚--而现在最亮眼的,是两类数据:除了是中国快时尚的领导品牌之一之外,在实体店方面,优衣库依然在加速:去年,优衣库在中国开了82家店铺,远超H&M的62家.Gap的28家和Zara的18家;截至2014财年(2014年8月31日)结束时,优衣库在整个大

一个有关MFC文本文件数据按行去重复的问题

问题描述 一个有关MFC文本文件数据按行去重复的问题 VC++6.0 读取文本文件中多行数据,然后去掉重复的行,提取数据到新的文件的方法是什么? 解决方案 读取到set/vector,然后去重复http://blog.csdn.net/zengraoli/article/details/39081707 解决方案二: 按行读取没文件,将读取到的每一行保存到一个set中,因为set中的元素必须不一样,因此你不必再做去重操作,读取完毕之后你写回到文件中即可.http://www.cplusplus.

DataTable,List去重复记录的方法

今天一位朋友问如何去掉DataTable里重复的记录(DataTable是别人返回过来的,不能再重新查询数据库,所以无法用sql中的select distinct xxx处理,只能在DataTable上动脑筋)  思路:将DataTable转成IEnumerable,然后就能调用Distinct方法了 by 菩提树下的杨过 http://yjmyzz.cnblogs.com/ using System.Collections.Generic; using System.Linq; using S

DataGridview 怎么去重复

问题描述 DataGridview怎么去除一个列重复A列121135怎么找出这些重复的并且把这重复这行删除掉.. 解决方案 本帖最后由 w63389 于 2015-07-22 15:51:58 编辑解决方案二:数据源上去重复.解决方案三:不要老想着在控件上处理,考虑下怎么在数据源上就直接过滤掉重复的数据.解决方案四:DataGridview只不过是个展示数据用的控件你应该在sql语句里就直接写去重复查询或者读到DataTable里之后用linq处理一下不要等显示出来了,才又让它不要显示解决方案五