C 黔驢技巧之去重(Distinct)

2022-02-18 06:34:20 字數 2191 閱讀 9397

關於c#中預設的distinct方法在什麼情況下才能去重,這個就不用我再多講,針對集合物件去重預設實現將不再滿足,於是乎我們需要自定義實現來解決這個問題,接下來我們詳細講解幾種常見去重方案,孰好孰歹自行判之。

首先給出我們需要用到的物件,如下:

public

class

person

public

int age

}

接下來我們新增100萬條資料到集合中,如下:

var list = new list();

for (int i = 0; i < 1000000; i++)

);}

接下來我們對年齡和名稱進行分組,然後取第一條即可達到去重,如下:

list = list.groupby(d => new

) .select(d =>d.firstordefault())

.tolist();

我們知道在c#中hashset對於重複元素會進行過濾篩選,所以我們寫下如下擴充套件方法,遍歷集合元素,最後利用hashset進行過濾達到去重目的,如下:

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 通常,我們一般都是這樣去做的,將要用於去重的資料放在乙個 集合 中...