gpt4 book ai didi

c# - 查找具有 40K 个对象的 2 个集合的差异

转载 作者:行者123 更新时间:2023-11-30 13:17:12 25 4
gpt4 key购买 nike

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

最佳答案

您可以使用 Except方法,它将为您提供 p2Coll 中不在 p1Coll 中的所有项目。

var diff = p2Coll.Except(p1Coll);

更新(一些性能测试):

免责声明:

实际时间取决于多种因素(例如集合的内容、硬件、您的机器上运行的内容、哈希码冲突的数量等),这就是我们使用复杂性和大 O 表示法的原因(请参阅 Daniel Brückner 评论)。

这是在我用了 4 年的机器上运行 10 次后的一些性能统计数据:

Median time for Any(): 6973,97658ms
Median time for Except(): 9,23025ms

Source code我的测试可以在 gist 上找到。


更新 2:

如果你想从第一个和第二个集合中得到不同的项目,你必须实际做 Expect两者兼而有之Union结果:

var diff = p2Coll.Except(p1Coll).Union(p1Coll.Except(p2Coll));

关于c# - 查找具有 40K 个对象的 2 个集合的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14221523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com