關於c#中預設的distinct方法在什麼情況下才能去重,這個就不用我再多講,針對集合物件去重預設實現將不再滿足,於是乎我們需要自定義實現來解決這個問題,接下來我們詳細講解幾種常見去重方案,孰好孰歹自行判之。
首先給出我們需要用到的物件,如下:
public接下來我們新增100萬條資料到集合中,如下:class
person
public
int age
}
var list = new list();接下來我們對年齡和名稱進行分組,然後取第一條即可達到去重,如下:for (int i = 0; i < 1000000; i++)
);}
list = list.groupby(d => new我們知道在c#中hashset對於重複元素會進行過濾篩選,所以我們寫下如下擴充套件方法,遍歷集合元素,最後利用hashset進行過濾達到去重目的,如下:) .select(d =>d.firstordefault())
.tolist();
public最後呼叫上述擴充套件方法即可去重,如下:static ienumerabledistinct(
this ienumerablesource,
func
keyselector)}}
list = list.distinct(d => new ).tolist();在實際專案中有很多通過具體實現類實現該介面,通過重寫equals和hashcode比較屬性值來達到去重目的,因為對於每乙個類都得實現對應比較器,所以並不通用,反而利用上述方式才是最佳,其實我們大可借助該比較介面實現通用解決方案,對於每乙個類都得實現乙個比較器的原因在於,我們將屬性比較放在類該介面內部,如果我們將屬性比較放在外圍呢,這個時候就達到了通用解決方案,那麼我們怎麼實現呢,通過委託來實現,實現該介面的本質無非就是比較hashcode,然後通過equals比較其值,當比較hashcode時,我們強制其值為乙個常量(比如0),當重寫equals方法我們呼叫委託即可,如下:
public最終通過指定屬性進行比較即可去重,如下:static
class
extensions
public
bool equals(t x, t y) =>_func(x, y);
public
int gethashcode(t obj) => 0
; }
}
list = list.distinct((a, b) => a.age == b.age && a.name == b.name).tolist();以上3種常見方式我們已經介紹完畢了,當資料量比較小時,我們大可忽略對集合進行各種操作所帶來的效能,但是一旦資料量很大時,我們可能需要考慮效能,能節省一點時間或許有必要,於是乎,在上述100萬條資料前提下,我們來分析其耗時情況,如下:
var list = new list();for (int i = 0; i < 1000000; i++));}
var time1 = time(() =>)
.select(d =>d.firstordefault())
.tolist();
});console.writeline($
"分組耗時:");
var time2 = time(() =>).tolist();
});console.writeline($
"hashset耗時:");
var time3 = time(() =>);
console.writeline($
"委託耗時:");
上述結果耗時大小比較理論應該不會出現逆轉的情況,只是多少的問題,資料量較少時理論上差異也很明顯,本文對於去重方式只是基於效能角度來分析,還是那句話大部分情況下,我們完全不需要考慮這些問題,不過,作為程式設計師的我們可能也想寫出高效能、高質量的**吧,有時候多考慮考慮也無妨,對自身有個好的**質量要求也未嘗不可,也還是那句話,孰好孰歹,自行判之。
C 黔驢技巧之實現統計結果排名
我們知道在sql server中可以利用row number rank等函式進行排名,在mysql中可以利用變數方式來實現排名,對於計算操作我傾向於放在記憶體中來操作,而資料庫只是做簡單的操作,儘管各個資料庫可能提供了對應函式來進行處理,但是一旦資料量大時,可能擱置到記憶體中計算不失為一種好的方式。...
mysql技巧之資料去重並記錄總數
1 使用distinct去重 適合查詢整張表的總數 有多個學校 教師投稿,需要統計出作者的總數 select count author as total from files 每個作者都投稿很多,這裡有重複的記錄。select distinct author from files 有可能兩個學校的教...
js 陣列去重小技巧
今天遇到乙個問題,需要對資料進行去重,想看一下有沒有什麼比較方便的方法,果然有些收穫。問題描述 我有乙個這樣的資料 要實現根據 projectid 去重,應該得到下面的結果 先從乙個簡單的問題入手,將乙個陣列去重 1,2,3,3,4 通常,我們一般都是這樣去做的,將要用於去重的資料放在乙個 集合 中...