我有兩個包含相同類型對象的集合,兩個集合都有大約40K個對象。使用40K對象找出2個系列的差異
每個集合包含對象的代碼基本上就像一本字典,除了我已經覆蓋了equals和散列函數:
public class MyClass: IEquatable<MyClass>
{
public int ID { get; set; }
public string Name { get; set; }
public override bool Equals(object obj)
{
return obj is MyClass && this.Equals((MyClass)obj);
}
public bool Equals(MyClass ot)
{
if (ReferenceEquals(this, ot))
{
return true;
}
return
ot.ID.Equals(this.ID) &&
string.Equals(ot.Name, this.Name, StringComparison.OrdinalIgnoreCase);
}
public override int GetHashCode()
{
unchecked
{
int result = this.ID.GetHashCode();
result = (result * 397)^this.Name.GetSafeHashCode();
return result;
}
}
}
的代碼我使用比較集合和獲得差異是隻是一個簡單的使用PLinq的Linq查詢。
ParallelQuery p1Coll = sourceColl.AsParallel();
ParallelQuery p2Coll = destColl.AsParallel();
List<object> diffs = p2Coll.Where(r => !p1Coll.Any(m => m.Equals(r))).ToList();
有沒有人知道比較這許多對象的更快的方法?目前在四核電腦上需要約40秒+/- 2秒。根據數據做一些分組然後再比較每組數據可能會更快嗎?如果我先根據名稱對數據進行分組,那麼最終會得到大約490個獨特的對象,如果我先用ID對它進行分組,那麼最終會得到大約622個獨特的對象。
在開始之前,請考慮緩存哈希碼。每次計算它都會損失一些時間。 –
什麼是'Name.GetSafeHashCode()'?也許緩存你的HashCode以免重新計算可能會有幫助,但我不知道有多少(如果/當'ID'或'Name'發生變化,你還必須無效/重新計算它) –
我想,你必須避免LINQ來實現性能。如果你能訂購你的收藏品,這將是最好的一點。 –