我需要迭代和计数。什么是最快或首选:ToArray() 还是 ToList()?[复制]
-
22-07-2019 - |
题
我有这样的代码:
void Foobar(string[] arr, Dictionary<string, string[]>)
{
var t = arr.Intersect(dic.Keys).ToList(); // .or ToArray() ?
foreach(var item in t)
{
..
}
var j = t.Count; // also I need this
}
哪种方法是首选?
我可以不带任何东西,但我需要知道尺寸,而且我不想打电话 Enumerable.Count<T>()
- 看来接下来要做更多的动作 Array<T>.Size
或者 List<T>.Count
. 。我对吗?
解决方案
实际上,在 Count(IEnumerable) 的当前 MS 实现中,有一个快捷方式可查找 IEnumerable 是否是 ICollection 并对其调用 Count。因此,计算元素的性能应该是可比的。
ToList 和 ToArray 有点相同。如果 IEnumerable 是 ICollection,则改为调用 CopyTo 方法,这会更快一些。
因此,选择什么使您的代码最具可读性,并为您的用例进行基准测试以获得明确的答案。
更新:我做了一个幼稚的基准测试。
从数组开始: var items = Enumerable.Range(1,1000).ToArray();
- 调用 ToList() :25毫秒/10000
- 调用 ToArray() :23 毫秒/10000
从 IEnumerable 开始: var items = Enumerable.Range(1,1000);
- 调用 ToList() :168毫秒/10000
- 调用 ToArray() :171 毫秒/10000
所以基本上你会得到类似的性能。
其他提示
如果你的真正的关心性能,你应该环比IEnumerable
又算什么呢,当您去。这避免了必须完全创建一个新的集合,与交点仅需要一次迭代:
void Foobar(string[] arr, Dictionary<string, string[]>)
{
var t = arr.Intersect(dic.Keys);
int count = 0;
foreach(var item in t)
{
count++;
..
}
var j = count;
}
但是,像其他人说:这气味微的优化。如果性能在这种情况下,真正的问题,至少要做到性能分析,找出哪些方法是真的最快的为您服务。的
,这种差异可能非常小,这是值得只是使用适合您的需要更好的方法。气味微优化的。
在这种情况下,因为所有你做的是枚举集和计数集(这两者都可以用一个IEnumerable做的),为什么不把它作为一个IEnumerable <>?
不隶属于 StackOverflow