利用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#这般犀利,世界就更美好了
作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。