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