C# LINQ返回IEnumerable并调用ToArray时出现意外行为
我注意到LINQ代码中存在一些奇怪的行为,并使用两种方法将问题简化为以下最小示例:C# LINQ返回IEnumerable并调用ToArray时出现意外行为,c#,.net,arrays,linq,C#,.net,Arrays,Linq,我注意到LINQ代码中存在一些奇怪的行为,并使用两种方法将问题简化为以下最小示例: IA Find(string n) { IA result; if (!_dictionary.TryGetValue(n, out result)) { throw Exception(); } return result; } IEnumerable<IA> Find(IEnumerable<string> names) {
IA Find(string n)
{
IA result;
if (!_dictionary.TryGetValue(n, out result))
{
throw Exception();
}
return result;
}
IEnumerable<IA> Find(IEnumerable<string> names)
{
return names.Select(Find).ToArray();
}
IA查找(字符串n)
{
IA结果;
if(!\u dictionary.TryGetValue(n,输出结果))
{
抛出异常();
}
返回结果;
}
IEnumerable查找(IEnumerable名称)
{
返回名称。选择(查找).ToArray();
}
这正如预期的那样有效
现在,我删除了.ToArray(),因此该方法如下所示:
IEnumerable<IA> Find(IEnumerable<string> names)
{
return names.Select(Find);
}
IEnumerable查找(IEnumerable名称)
{
返回名称。选择(查找);
}
此更改将导致不引发异常,即使某些名称在_dictionary中找不到,但在names参数中存在
是什么(对我来说)导致LINQ的这种意外行为 这是因为延迟执行。在执行Linq之前,不会对其求值 调用
ToArray()
会导致IEnumerable
的完整枚举,从而发生异常
第二个方法不枚举IEnumerable
,执行延迟,直到调用方需要它
如果要枚举
的结果,请查找例如
var result = Find(new[] { "name" }).ToList();
或
然后会发生异常。延迟执行。执行选择操作时,不会迭代结果。
foreach (var found in Find(new[] { "name" }))
{
...
}