c 中關於list去重的問題

2021-09-20 09:29:52 字數 1913 閱讀 1957

system.linq下為ienumerable(list是它的子類)拓展了distinct方法,用於對結果集進行去重處理。下面我們來看一下我們可能正在犯的錯誤吧。

首先我們定義乙個class來演示,並且向它追加一些重複的成員,看一下distinct()的效果如何:

static void main(string args)

;ints.add(45);

listnewlist = ints.distinct().tolist();

foreach (int item in newlist)

console.read();

}

結果輸出:12,23,45很好沒有問題,圓滿的實現了我們的需求。

重點來了,我們再看乙個例子,先定義個model類如下:

public class tbinpn 

public string pn

public string spec

public string goods

public string hscode

}

建立乙個list,並且向它追加一些重複的成員,看一下distinct()的效果如何:

static void main(string args)

);tbinpns.add(new tbinpn );

tbinpns.add(new tbinpn );

tbinpns.add(new tbinpn );

listnewtbinpns = tbinpns.distinct().tolist();

console.writeline($"去重後還剩 條資料。");

console.read();

}

這次輸出的結果有點奇怪了,

上面我們介紹到distinct有兩個過載,分別是:

第乙個需要我們傳遞乙個比較器,而我們剛剛使用的是第二個,沒有給比較器,所以自動使用了預設的比較器,但是為啥第乙個demo可以而第二個不行?因為第乙個demo中我們是對值型別進行去重的,預設的比較器是可以完成的,但是後面的demo是引用型別,預設比較器比較的是其引用位址,list中的每乙個元素都是乙個新例項,所以位址是不一樣的,因此沒辦法去重。

一起來看一下,如何自定義乙個比較器,實現引用型別的去重吧,首先我們定義乙個類整合iequalitycomparer介面,然後按照vs的提示我們讓vs自動幫我們實現這個介面,然後我們修改equals和gethashcode這兩個方法即可。**如下:

public class comparer: iequalitycomparer

public int gethashcode(tbinpn obj)

}

將剛剛的**稍作修改,將比較器傳遞進去看一下結果:

static void main(string args)

);tbinpns.add(new tbinpn );

tbinpns.add(new tbinpn );

tbinpns.add(new tbinpn );

listnewtbinpns = tbinpns.distinct(new comparer()).tolist();

console.writeline($"去重後還剩 條資料。");

結果表明我們已經實現了引用型別的去重。

list集合去重問題

集合去掉重複元素 1 字串去重 public static void main string args for string s set 2 物件去重 package com.myproj.pojo public class people public void setname string nam...

list中的字典去重

list中的字典 格式 list dict 如上,list dict中有三個字典,但是是重複的,這裡需要去重,保留乙個不重複的dict即可 def list dict duplicate removal list dict list中dict重複的話,去重 run function lambda x...

對List中物件的去重

今天專案中遇到了乙個對list中物件去重的問題。首先對於我們自己系統中的物件我們只要重寫該物件的 equal 和 hashcode 即可 利用物件中的能夠唯一確定物件的屬性 但是我遇到的不是本系統的物件,而是另乙個系統中的物件,我本身是無法對其進行重寫的。我的處理方法是遍歷list,利用map un...