Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ返回IEnumerable并调用ToArray时出现意外行为_C#_.net_Arrays_Linq - Fatal编程技术网

C# LINQ返回IEnumerable并调用ToArray时出现意外行为

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) {

我注意到LINQ代码中存在一些奇怪的行为,并使用两种方法将问题简化为以下最小示例:

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" }))
{
    ...
}