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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM