有效地迭代固定列表

时间:2017-07-13 08:25:20

标签: c# performance unity3d iteration

我们有这样的代码:

var animals = new List<Animal> { lion, bird, mouse};
foreach(var animal in animals) ....

此代码属于项目的性能关键部分,因此我希望有效地执行此操作。我不想产生任何内存垃圾,因为这样的操作实际上并不需要内存分配。所以我想避免创建一个新的List或所有LINQ的东西。我理想的是这样的代码:

foreach(var animal in { lion, bird, mouse})  ...

当然这不会编译。有没有办法在不产生任何内存垃圾的情况下做到这一点?

p.s:我还想避免污染函数之外的任何命名空间。

3 个答案:

答案 0 :(得分:1)

如果它是一个固定列表,其已知且性能至关重要,那么请不要迭代开始:

var lion = ....;
var bird = ....;
var mouse = ....;

process(lion);
process(bird);
process(mouse);

//if the fixed list is not too long
//consider using [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Process(Animal animal) { ... }

我很想知道这是什么性能关键代码,你不能为固定数组分配一次,然后在你需要的时候正常迭代它。

答案 1 :(得分:0)

您可以使用数组,但它只比列表略好:

 foreach(var animal in new[] { lion, bird, mouse})  ...

此外,就像Tim评论的那样,您可以提前创建数组,而不是每次调用。所以作为私有静态只读字段。

如果性能至关重要,则应创建单独的私有函数,或者在C#7中创建本地函数。见https://garywoodfine.com/c-local-functions/

 function a()
 {
     function mylocalfunction(Animal animal)
     {
         //...
     }
     mylocalfunction(lion);
     mylocalfunction(bird);
     //...
 }

答案 2 :(得分:-1)

使用lamda表达式,虽然它们不具有性能效率,但可以解决您的查询问题。

List<string> list = new List<string>() { "1", "2", "3", "4" };

list.ForEach(s => Console.WriteLine(s));