同じタイプのオブジェクトを含む2つのコレクションがあり、両方のコレクションにはそれぞれ約40Kのオブジェクトがあります。
各コレクションに含まれるオブジェクトのコードは、equals関数とhash関数をオーバーライドしたことを除けば、基本的に辞書に似ています。
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の一意のオブジェクトになります。