使用C#去掉10萬級陣列中重複的資料
阿新 • • 發佈:2019-02-13
最近做了個小程式,其中有個功能是去掉陣列中的重複資料,開始沒有考慮陣列數量的問題,使用了一般的演算法。但後面別人和我說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; }