Dan*_*ner 15
我会用
var count = Enumerable.Intersect(listA, listB).Count(word => word.Length > 3);
Run Code Online (Sandbox Code Playgroud)
假设listA和listB类型IEnumerable<String>.
Shu*_*oUk 15
假设列表1的长度为N,列表2的长度为M:
我会先过滤,因为这是一个廉价的操作O(N + M)然后做交叉,一个相对昂贵的操作基于当前的实现.Intersect调用的成本很复杂,并且基本上由散列函数的行为驱动:
这让你:
int count = Enumerable.Intersect(
list1.Where(word => word.Length > 3),
list2.Where(word => word.Length > 3)).Count();
Run Code Online (Sandbox Code Playgroud)
顺便提一下,Enumerable.Intersect方法的性能行为可能会根据参数的顺序发生很大变化.
在大多数情况下,使第一个参数中较小的一个产生更快,更高效的内存代码,第一个参数用于构造支持临时(基于散列)的Set.这当然是编码为(隐藏的)实现细节,因此只有在性能分析后显示为问题并且如果是这样突出显示为微优化时才应考虑.
list2上的第二个过滤器从根本上说是不正确的(因为Intersects无论如何都会删除这些条目)
如果很可能以下更快
int count = Enumerable.Intersect(
list1.Where(word => word.Length > 3),
list2).Count();
Run Code Online (Sandbox Code Playgroud)
然而,与计算它们的哈希码相比,长度过滤对于长串非常便宜.只有通过适合您使用的输入进行基准测试才能找到更好的产品.
| 归档时间: |
|
| 查看次数: |
394 次 |
| 最近记录: |