今天除錯**時發現list的distinct方法在對引用型別操作時並沒有去重,後來查閱資料發現list去重操作物件集合時比較的是物件的乙個個引用位址,
因為集合裡的物件都是乙個個單獨的例項,所以並不會把內容相同的元素去掉,要想真正去重還是要自己寫方法篩選,但是值型別集合的就可以直接操作,包括unoin,intersect方法。
當預設distinct方法不滿足需求時,可以使用他的過載方法自定義乙個比較器實現iequalitycomparer介面就行了
這是乙個在網上找的可拓展的泛型去重方法
/// 可拓展的list物件集合去重比較器
/// 要去重的物件類
/// 自定義去重的字段型別
public class compare : iequalitycomparer
private func _getfield;
public compare(func getfield)
this._getfield = getfield;
public bool equals(t x, t y)
return equalitycomparer.default.equals(_getfield(x), _getfield(y));
public int gethashcode(t obj)
return equalitycomparer.default.gethashcode(this._getfield(obj));
/// 自定義distinct擴充套件方法
/// 要去重的物件類
/// 自定義去重的字段型別
/// 要去重的物件
/// 獲取自定義去重字段的委託
public static ienumerable mydistinct(this ienumerable source, func getfield)
return source.distinct(new compare(getfield));
呼叫方式是 list.mydistinct(s => s.activityid).tolist() //可以傳委託也可以是匿名方法(lamda表示式)
List集合去重
第一種 list每remove掉乙個元素以後,後面的元素都會向前移動,此時如果執行i i 1,則剛剛移過來的元素沒有被讀取。string str1 newstring abcde1 string str2 newstring abcde2 string str3 newstring abcde3 s...
List集合去重
首先,我們都知道list集合是乙個儲存有序可重複元素的容器,那麼如果要對乙個list去重有哪些方法呢?方式一 迴圈list中的所有元素然後刪除重複 public static list removeduplicate list list return list public static list ...
c 物件集合去重 《C 程式設計入門》概覽
前言 01 c 簡介 c 程式設計入門 01 c 簡介 02 整合開發環境 c 程式設計入門 02 c 整合開發環境 04 c 資料型別 c 程式設計入門 04 c 資料型別 05 c 型別轉換 06 c 變數 常量 07 c 運算子和表示式 08 c 迴圈結構列印各種圖形 09 c 陣列,集合 1...