C# 大資料量List<T>去重複方法效率比較
阿新 • • 發佈:2021-10-20
大資料量List<T>中的資料根據多個屬性進行去重有多種方法,在資料量達到10萬以上時,各種方法效率有明顯的區別,這裡只列舉兩種方式: 這裡以類Model為例建立List<Model>
public class Model { public string Id { get; set; } public string Name { get; set; } public int Style { get; set; } }
- 建立比較類(實現IEqualityComparer介面),重寫Equals方法
publicclass ModelComparer : IEqualityComparer<Model> { public bool Equals(Model x, Model y) { if (x.Id == y.Id && x.Name == y.Name) return true; else return false; } public int GetHashCode(Model obj) {return 0; } }
使用時直接使用Distinct方法:
var lstTemp = lstOrigin.Distinct(new ModelComparer());
但是這種方式去重效率非常慢,20萬條資料能達到15-20分鐘,如果資料量較大又對效率有要求,那麼可以嘗試下面一種方法:
改進辦法
public class CommonEqualityComparer<T, V> : IEqualityComparer<T> { private Func<T, V> keySelector; publicCommonEqualityComparer(Func<T, V> keySelector) { this.keySelector = keySelector; } public bool Equals(T x, T y) { return EqualityComparer<V>.Default.Equals(keySelector(x), keySelector(y)); } public int GetHashCode(T obj) { return EqualityComparer<V>.Default.GetHashCode(keySelector(obj)); } } public static class DistinctExtensions { public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector) { return source.Distinct(new CommonEqualityComparer<T, V>(keySelector)); } }
使用時:
var lstTemp = lstOrigin.Distinct(p => (p.Id + p.Name)).ToList();
這種方法能將效率從15~20分鐘提高到5秒以內,雖然這種將兩個欄位字串相加作為比較引數的比較方法有些侷限,但是相比於前一種方式方式可以極大地提高效率。另也測試過在新建List後,在迴圈新增資料時通過list.Contains()的方法和通過Linq的方法去重效率都比較低,都與第一種方法時間相近,網上相關文章比較多這裡就不列舉了。