今天寫代碼時,需要對一個數組對象中按一定規則合並、去重處理,不想再毫無新意手動寫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#這般犀利,世界就更美好了