对于一个大规模的集合运算,我已经用List<T>和Union<T>做过了,Intersect<T>。我是否可以将底层集合交换为HashSet<T>,而不是List<T>来执行这些LINQ Set操作,并立即看到性能改进?
List<T>
Union<T>
Intersect<T>
HashSet<T>
fslejnso1#
如果底层集合还没有在接口中实现set操作,那么这些方法都足够智能,可以使用O(n)算法,因此对于大多数用例来说,性能差异不足以担心。在.NET Framework中,我看到这些方法中的每一种方法在我的基于LINQPad的基准测试中有大约10%的差异。在.NET 6中,没有统计学上的显著差异。这并不奇怪,因为source code在所有这些方法中只使用内部Set实现,而不管它被赋予什么IEnumerable<>。
O(n)
Set
IEnumerable<>
1条答案
按热度按时间fslejnso1#
如果底层集合还没有在接口中实现set操作,那么这些方法都足够智能,可以使用
O(n)
算法,因此对于大多数用例来说,性能差异不足以担心。在.NET Framework中,我看到这些方法中的每一种方法在我的基于LINQPad的基准测试中有大约10%的差异。
在.NET 6中,没有统计学上的显著差异。这并不奇怪,因为source code在所有这些方法中只使用内部
Set
实现,而不管它被赋予什么IEnumerable<>
。