我是否枚举了我的 IEnumerable<T> n 次?
Am I enumerating my IEnumerable<T> n times?
我 相当 对 C# 中的 LINQ 感到满意,但我不知道我的 foreach 循环是否导致了过多的枚举。
假设下面的代码片段是运行,
var listOfStuff = new List<CustomObject>
{
new CustomObject { Id = 1, Cost = 20M },
new CustomObject { Id = 2, Cost = 11M },
new CustomObject { Id = 3, Cost = 3.75M },
new CustomObject { Id = 4, Cost = 50.99M }
};
var newObjects = listOfStuff.Select(thing =>
new AnotherObject { Id = x.ID, NegaCost = decimal.Negate(x.Cost) });
foreach (var i in n) // a list of objects with a length of n
{
var match = newObjects.Where(PreDefinedPredicate);
i.DoSomethingWith(match);
}
是一个新的 AnotherObject
实例被创建了 n 次还是我误解了多重枚举的概念?
这取决于你在 i.DoSomethingWith
中用 match
做什么,但如果你在那里迭代它,那么是的。
你总是可以检查你的假设引入了一些副作用,比如 Console.WriteLine
:
var newObjects = listOfStuff.Select(x =>
{
Console.WriteLine($"Here with id: {x.Id}"); // SIDEEFFECT
return new AnotherObject { Id = x.ID, NegaCost = decimal.Negate(x.Cost) };
});
foreach (var i in n) // a list of objects with a length of n
{
var match = newObjects.Where(PreDefinedPredicate);
i.DoSomethingWith(match);
}
我 相当 对 C# 中的 LINQ 感到满意,但我不知道我的 foreach 循环是否导致了过多的枚举。
假设下面的代码片段是运行,
var listOfStuff = new List<CustomObject>
{
new CustomObject { Id = 1, Cost = 20M },
new CustomObject { Id = 2, Cost = 11M },
new CustomObject { Id = 3, Cost = 3.75M },
new CustomObject { Id = 4, Cost = 50.99M }
};
var newObjects = listOfStuff.Select(thing =>
new AnotherObject { Id = x.ID, NegaCost = decimal.Negate(x.Cost) });
foreach (var i in n) // a list of objects with a length of n
{
var match = newObjects.Where(PreDefinedPredicate);
i.DoSomethingWith(match);
}
是一个新的 AnotherObject
实例被创建了 n 次还是我误解了多重枚举的概念?
这取决于你在 i.DoSomethingWith
中用 match
做什么,但如果你在那里迭代它,那么是的。
你总是可以检查你的假设引入了一些副作用,比如 Console.WriteLine
:
var newObjects = listOfStuff.Select(x =>
{
Console.WriteLine($"Here with id: {x.Id}"); // SIDEEFFECT
return new AnotherObject { Id = x.ID, NegaCost = decimal.Negate(x.Cost) };
});
foreach (var i in n) // a list of objects with a length of n
{
var match = newObjects.Where(PreDefinedPredicate);
i.DoSomethingWith(match);
}