2012-09-12 35 views
1

我只是看看我们的代码库的历史,发现办理入住手续从这个这种变化:这个ToArray()实现如何更优化?

public virtual T[] ToArray() 
    { 
     List<T> list = new List<T>(); 
     foreach (object item in List) 
     { 
      list.Add((T)item); 
     } 

     return list.ToArray(); 
    } 

这样:

public virtual T[] ToArray() 
    { 
     T[] result = new T[List.Count]; 
     for (int i = 0; i < List.Count; ++i) 
     { 
      result[i] = (T)List[i]; 
     } 

     return result; 
    } 

与评论:优化ToArray的执行,以避免产生过程中有多个数据结构。

我想知道为什么这里有一个优化。 for()可能比foreach()更快,但“创建多个数据结构”在哪里?

P/S:谁写的这是在度假

+2

我看到的最大的优化是避免使用名单,只是简单地排列,通过了过程坚持 –

回答

9

在原代码的家伙,你创建一个List<T> - 由于没有指定的容量,所以它可能涉及复制内部数组几次 - 然后你致电List<T>,致电ToArray,产生副本。

较新的版本不这样做。它创建一个数组,并将原始列表复制到其中。

诚然,仅仅使用LINQ的ToArray方法会更简单,很可能更高效,这是为什么开始一个虚拟的方法,但...

3

第一个实现将创建一个中间人目前还不清楚额外的List对象;它只是GC清理的一件事。这种优化几乎肯定不会引起注意,除非这个例程在恶魔般的高级别中被击中。

否则,它是否使用foreachfor无关。这种选择很大程度上受列表在枚举时无法修改的规则的驱动。

+2

这将是难于使用'foreach'同时建立一个这样的数组,因为你仍旧需要保持索引来知道在哪里*写入数组。 –