我们有这样的代码:
var animals = new List<Animal> { lion, bird, mouse};
foreach(var animal in animals) ....
此代码属于项目的性能关键部分,因此我希望有效地执行此操作。我不想产生任何内存垃圾,因为这样的操作实际上并不需要内存分配。所以我想避免创建一个新的List或所有LINQ的东西。我理想的是这样的代码:
foreach(var animal in { lion, bird, mouse}) ...
当然这不会编译。有没有办法在不产生任何内存垃圾的情况下做到这一点?
p.s:我还想避免污染函数之外的任何命名空间。
答案 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));