你還在使用迴圈讓 List 裡面的重複資料移除嗎?我們可以有更好的解決方法,讓多行的 For 回圈簡短成一行就可以達到讓 List 裡面的資料不重複喔!
一般去除重複
假如說現在有一個 List<String> DuplicateList = new List(); ,如果我想要讓裡面的重複值移除只要使用下面的方法就可以簡單達成囉!
DuplicateList = DuplicateList.Distinct().ToList();
Class 去除重複
當你要將 Class 去除重複的話,就需要使用到 IEqualityComparer 這個 Interface 來定義如何才是該 Class 的重複。聽起來很複雜,但實作上蠻簡單的。
下面是這一次範例的 Data Class,該 ID 是這一次用來判斷是否重複的依據。
public class Data
{
public string ID { get; set; }
public string Note { get; set; }
}
當我們要利用 IEqualityComparer 來自定義我們的重複依據的話,首先建立一個新的 Class,然後繼承 IEqualityComparer,並實作該介面的方法。
該介面方法有 Equals 以及 GetHashCode。Equals 表示當遇到兩個 Class 時,數值為何時這兩個 Class 才是相等的。下面範例就表示當兩個 Class ID 相等時就是相等。GetHashCode 是需要回傳該 Class 的雜湊碼,這邊的習慣會利用剛剛判斷的條件湊出 String 然後再使用 GetHashCode() 方法才取得雜湊碼。
public class DataICompate : IEqualityComparer<Data>
{
public bool Equals(Data x, Data y)
{
return x.ID == y.ID;
}
public int GetHashCode(Data obj)
{
return obj.ID.GetHashCode();
}
}
使用上最一開始使用 Distinct 差不多,只需要在方法中 new 剛剛建立好的 DataICompate 就可以囉
var DataList = new Data[]
{
new Data() { ID = "1", Note = "123" },
new Data() { ID = "1", Note = "ABC" },
new Data() { ID = "2", Note = "ASD" },
new Data() { ID = "3", Note = "QWE" },
};
var Result = DataList.Distinct(new DataICompate());
foreach (var item in Result)
{
Console.WriteLine($"ID:{item.ID} Note:{item.Note}");
}
ID:1 Note:123
ID:2 Note:ASD
ID:3 Note:QWE