1

我只是看一下我们的代码库的历史记录,并发现了一个从这里发生变化的签入:

    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:写这篇文章的人现在正在度假

4

3 回答 3

9

在原始代码中,您创建一个List<T>- 而不指定容量,因此它可能涉及多次复制内部数组 - 然后您调用ToArrayList<T>从而产生一个副本。

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

诚然,仅使用 LINQ 的ToArray方法会更简单,甚至可能更有效,而且尚不清楚为什么这是一个虚拟方法开始,但是......

于 2012-09-12T02:02:10.610 回答
3

第一个实现创建了一个中间人额外的 List 对象;GC 清理只是另一件事。这种优化几乎肯定不会被注意到,除非这个例程被击中到非常高的水平。

foreach否则,它与是否使用或无关for。这种选择主要是因为列表在被枚举时不能被修改的规则。

于 2012-09-12T02:05:50.037 回答
0

为了更快地将 List 转换为 Array,HPCsharp nuget 包实现了 List.ToArray() 的并行(多核)版本:

public virtual T[] ToArray()
{
    return List.ToArrayPar();
}

此方法不是必需的,只要在需要 Array 的地方使用 List.ToArrayPar() 函数即可。这个并行版本比 List.ToArray() 快大约 3 倍

于 2019-09-03T03:12:25.773 回答