0

我想拥有最好的性能,我知道数组比列表快,但是使用数组我需要为计数器创建一个变量,甚至可能需要使用.Count.Length查找大小,所以我可能最好只使用列表?以下是示例。

示例 1:

foreach (var item in items)
    ItemCollection.Add(item);

示例 2:

int i = 0;

foreach (var item in items)
{
    ItemCollection[i] = item;
    i++;
}

示例 3:

for (int i = 0; i < items.Count; i++)
    ItemCollection[i] = item;
4

3 回答 3

4

示例一是您最好的选择,因为您似乎正在尝试动态更改数组/列表的大小,

示例二只是愚蠢的。

当您希望扩展数组时,示例 3 会变得很棘手。看我的第一点

在您的第三个示例中要注意的一点是在您的 for 循环中

 for (int i = 0; i < items.Count; i++)

这将重新评估 items.Count 每次迭代,以便您可以通过将其移出 for 循环来进行微优化

var length = items.Count
for (int i = 0; i < length; i++)
于 2013-08-01T20:44:58.320 回答
3

列表的性能几乎与数组的性能相同。如果您知道要添加的项目的确切数量,您还可以通过创建具有确切数量的元素的列表来消除潜在的内存开销,以避免重新分配Add

// Reserve the required number of spots in the list
var ItemCollection = new List<ItemType>(items.Count);
foreach (var item in items)
    // Add is not going to cause reallocation,
    // because we reserved enough space ahead of time
    ItemCollection.Add(item);

在大多数情况下,这被证明是过早的微优化。

于 2013-08-01T20:46:21.630 回答
0

好吧,您可以在 Arrays 上使用“foreach”:

int[] bob = new int[] { 0, 1, 2, 3 };

foreach (int i in bob)
{
    Console.WriteLine(i);
}

无论如何,在大多数情况下,差异应该可以忽略不计。您还必须意识到'foreach' 不会神奇地遍历列表,它会调用'GetEnumerator' 然后使用它来循环,它也使用一些ram(实际上不仅仅是创建'int i')。

当我知道长度是固定的并且会保持很小的时候,我通常会使用数组,否则使用列表会容易得多。

此外,在您知道需要之前不要进行优化,否则您几乎是在浪费时间。

于 2013-08-01T20:51:13.287 回答