0

我有一个 BaseTool 数组,我想返回 T 类型的第一个元素:

public BaseTool GetTool<T>() where T : BaseTool
{
    foreach (var tool in tools)
    {
        if (tool is T)
        {
            return tool;
        }
    }
    return null;
}

Rider 建议我改用 LINQ 方法:

public BaseTool GetTool<T>() where T : BaseTool
{
    return tools.OfType<T>().FirstOrDefault();
}

我想知道这两个实现是否会执行相同的操作。基本循环变体在找到第一个 T 实例时返回。我知道 OfType 使用延迟执行。但我不确定上述与 FirstOrDefault 的组合是否会导致对整个数组的 OfType 评估。

4

1 回答 1

4

FirstOrDefault只迭代到它需要的地方(找到第一个元素) - 所以不,这不会导致整个序列被评估,除非没有该类型的元素(或者它只是最后一个元素)。

更多细节在我的Edulinq 博客文章中,或者你可以查看.NET Core 实现——它比我的 Edulinq 实现稍微复杂一些,但仍然很懒(除非你有一个IList<T>具有非常实现的Count属性的实现,或者类似的东西)。

于 2019-07-23T10:12:35.740 回答