我需要迭代和计数。什么是最快或首选的方法:ToArray()还是ToList()?
我需要迭代和计数。什么是最快或首选的方法:ToArray()还是ToList()?
我有这样的代码:
void Foobar(string[] arr, Dictionary) { var t = arr.Intersect(dic.Keys).ToList(); // 还是 ToArray()? foreach(var item in t) { .. } var j = t.Count; // 我也需要这个 }
哪种方法更好?
我可以不用任何一个,但我需要知道大小,而且我不想调用 `Enumerable.Count
这个问题的出现的原因是想要在迭代和计数时找到最快或首选的方法是使用ToArray()还是使用ToList()。解决方法是比较两种方法的性能差异,并根据自己的需求选择适合的方法。
通常情况下,ToArray()和ToList()之间的性能差异非常小,可以根据自己的需求选择使用哪种方法。这种微观优化的差异几乎可以忽略不计。
在这种情况下,既然你只是在枚举集合并计数集合(这两个操作都可以使用IEnumerable完成),为什么不将其保留为IEnumerable<>呢?
我猜这自然而然地引出了另一个问题:既然性能在大多数情况下是相同的,我应该使用哪种类型作为我的“默认”集合类型呢?我个人更喜欢使用List
绝对没错,这是关于在常见情况下使用的默认类。我更喜欢将数组作为固定长度的集合。只有在明确需要动态长度时才使用它。
为了避免在不需要一次获取所有元素并且需要在同一个可枚举对象的不同位置使用它们时重新枚举可枚举对象以创建列表/数组,你有什么建议?
问题的出现原因是作者想要找到在迭代和计数时最快或首选的方法,即使用ToArray()还是ToList()。
解决方法是通过在循环中逐个计数而不创建新的集合来避免性能问题。这样可以避免重复迭代集合,只需迭代一次即可获得交集。作者提供了一个示例代码,其中使用foreach循环对交集进行迭代,并在每次迭代时递增计数器。
同时,作者提到了性能优化的微观优化问题,并建议进行性能分析,以找出最快的方法。
然后,作者讨论了使用Count方法和手动计数的性能差异。通过手动计数,只需要对集合进行一次迭代,而使用Count方法则需要对集合进行两次迭代(一次用于转换,一次用于foreach循环)。
最后,作者提出了一个问题,即如何在不需要一次获取全部元素并且需要在同一个枚举器上的不同位置使用它们时,避免重新枚举可枚举对象的问题。
作者讨论了使用ToArray()和ToList()方法进行迭代和计数的性能问题,并提供了一种使用手动计数的解决方法。此外,还有性能优化的问题,并提出了一个关于避免重新枚举可枚举对象的问题。
问题的原因是作者想知道在迭代和计数方面,使用ToArray()和ToList()哪个更快或更常用。解决方法是进行性能测试并通过比较结果选择最适合自己代码的方法。
在当前的MS实现中,Count(IEnumerable)有一个快捷方式,它会检查IEnumerable是否是ICollection,并调用它的Count方法。因此,对于计算元素数量,性能应该是可比较的。
ToList和ToArray有点类似。如果IEnumerable是ICollection,则调用CopyTo方法,这个方法会更快一些。
因此,选择最容易阅读的方法,并针对自己的用例进行基准测试,以得到明确的答案。
更新:
作者进行了一个简单的基准测试。
从一个数组开始:var items = Enumerable.Range(1,1000).ToArray();
- 调用ToList() : 25ms / 10000
- 调用ToArray() : 23 ms / 10000
从一个IEnumerable开始:var items = Enumerable.Range(1,1000);
- 调用ToList() : 168ms / 10000
- 调用ToArray() : 171 ms / 10000
所以基本上你可以得到可比较的性能。
根据以上内容可以得出结论,使用ToArray()和ToList()在迭代和计数方面性能是可比较的。具体选择哪个方法应根据代码的可读性和基准测试的结果来决定。