1. 程式人生 > >使用C#去掉10萬級陣列中重複的資料

使用C#去掉10萬級陣列中重複的資料


最近做了個小程式,其中有個功能是去掉陣列中的重複資料,開始沒有考慮陣列數量的問題,使用了一般的演算法。但後面別人和我說5W條資料等了10分鐘還沒有成功,汗。。。

(剛才寫這篇文章,瀏覽器突然自動重新整理了,鬱悶呀,寫的一點都沒有了,都沒自動儲存草稿,糾結)

後面用了別一種演算法,基本上20S內可以完成了。

測試資料1萬條

第一種演算法(4分鐘)

/// <summary>
        /// List泛型去重
        /// </summary>
        /// <param name="list">由一維陣列組成的泛型</param>
        /// <param name="ItemID">要去除重複的項</param>
         private void RemoveRepeaterUrl(ref List<string[]> list,int ItemID)
         {
             for (int i = 0; i < list.Count; i++)
             {
                 for (int j = (i + 1); j < list.Count; j++)
                 {
                     if (list[j][ItemID] == list[i][ItemID])
                     {
                         list.RemoveAt(j);//去除相同的項
                         i = 0;//從新開始去重,如果陣列內有大量重複的項,僅一次去重不能解決問題。這樣的用法會使效率慢1/3
                         j = 0;
                     }
                 }
             }
         }

第二種演算法(4S)

        //去除重複的資料, 返回list

        //利用類庫中的hashtable類的containsKeys方法判斷hashtable中是否存在這個資料,要是不存在就

        //把資料新增到新的List中,最後清空hashtable

        public List<string> getUnque(List<string> list)
        {
            List<string> list1 = new List<string>();
            Hashtable hash = new Hashtable();
            foreach (string stu in list)
            {
                string[] kk1 = stu.Split(new string[] { "--" }, StringSplitOptions.RemoveEmptyEntries);
                string comword = kk1.Length==3 ? kk1[2]:"";
                if (!hash.ContainsKey(comword))
                {
                    hash.Add(comword, comword);
                    list1.Add(stu);
                }
            }
            hash.Clear();
            hash = null;
            return list1;
        }