J'ai deux collections contenant toutes deux le même type d'objet et les deux collections ont environ 40 000 objets chacune.
Le code pour l'objet que chaque collection contient est fondamentalement comme un dictionnaire, sauf que j'ai surchargé les fonctions equals et 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;
}
}
}
Le code que j'utilise pour comparer les collections et obtenir les différences est juste une simple requête Linq utilisant PLinq.
ParallelQuery p1Coll = sourceColl.AsParallel();
ParallelQuery p2Coll = destColl.AsParallel();
List<object> diffs = p2Coll.Where(r => !p1Coll.Any(m => m.Equals(r))).ToList();
Quelqu'un connaît-il un moyen plus rapide de comparer autant d'objets ? Actuellement, cela prend environ 40 secondes +/- 2 secondes sur un ordinateur à quatre cœurs. Serait-il plus rapide de regrouper les données, puis de comparer chaque groupe de données en parallèle ? Si je regroupe d'abord les données en fonction du nom, j'obtiendrai environ 490 objets uniques, et si je les regroupe d'abord par ID, j'obtiendrai environ 622 objets uniques.