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

本文关键字:数组 列表 创建 值得 变量 是否 | 更新日期: 2023-09-27 18:25:55

我想拥有最好的性能,我知道数组比列表快,但有了数组,我需要为计数器创建一个变量,甚至可能需要使用.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将变得棘手。查看我的第一点

在第三个例子中需要注意的一点是,在for循环中,您有

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

这将重新估价项目。计算每一次迭代,这样你就可以通过将其移出循环来进行微观优化

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

列表的性能与数组的性能几乎相同。如果你知道你计划添加的项目的确切数量,你也可以通过创建一个包含确切数量元素的列表来消除潜在的内存开销,以避免在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);

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

您可以在Arrays上使用"foreach":

int[] bob = new int[] { 0, 1, 2, 3 };
foreach (int i in bob)
{
    Console.WriteLine(i);
}

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

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

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