1. 程式人生 > 其它 >C# 大資料量List<T>去重複方法效率比較

C# 大資料量List<T>去重複方法效率比較

大資料量List<T>中的資料根據多個屬性進行去重有多種方法,在資料量達到10萬以上時,各種方法效率有明顯的區別,這裡只列舉兩種方式: 這裡以類Model為例建立List<Model>

 public class Model
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public int Style { get; set; } 
    }
  1. 建立比較類(實現IEqualityComparer介面),重寫Equals方法
public
class 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;

        public
CommonEqualityComparer(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的方法去重效率都比較低,都與第一種方法時間相近,網上相關文章比較多這裡就不列舉了。