我有 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 个唯一对象。