是否值得创建新变量来使用数组而不是列表?

时间:2013-08-01 20:40:48

标签: c# arrays list for-loop foreach

我希望获得最佳性能,并且我知道该数组比列表更快但是使用数组我需要为计数器创建变量,甚至可能需要使用.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;

3 个答案:

答案 0 :(得分: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++)

答案 1 :(得分: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);

在大多数情况下,这是一个过早的微观优化。

答案 2 :(得分:0)

你可以在阵列上使用'foreach':

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

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

无论如何,在大多数情况下,差异应该是微不足道的。你还必须意识到'foreach'并没有神奇地遍历列表,它调用'GetEnumerator'然后使用它来循环,它也使用一些ram(实际上不仅仅是创建'int i')。

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

另外,在你知道自己需要之前不要进行优化,否则你会浪费你的时间。