可能的重复:
在 LINQ 查询中调用 ToList() 还是 ToArray() 更好?

我有这样的代码:

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 <>?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top