如果在任何时候返回默认值,则停止 LINQ 查询

key*_*rdP 3 c# linq syntactic-sugar default-value short-circuiting

当以流畅的语法编写时,是否有语法糖或方法可以在同一行中“短路”LINQ 语句?例如,如果null由调用返回FirstOrDefault,是否可以返回 null,否则继续方法链的其余部分?

List<string> testList = new List<string>() { "some", "strings" };
var reversed = testList.FirstOrDefault(x => x == "hello").Reverse();
Run Code Online (Sandbox Code Playgroud)

该调用将返回 null,因此该语句将在调用时FirstOrDefault抛出一个异常。有没有办法在调用之前停止,因为此时返回了默认值?ArgumentNullExceptionReverseReverse

(我知道查询可以分成另一行,并且default(T)可以在之前进行检查Reverse,或者,对于简单的情况,可以使用条件运算符 ( ?:),但我很好奇我是否缺少更长/更复杂链的特定功能)

编辑 - 为了澄清这只是一个展示想法的示例,它不是任何实际代码的一部分。我想避免引发异常,因为只分割行并进行检查会提高性能。

p.s*_*w.g 5

如果您想要将集合解析为单个项目并操作该项目,但仍然可以优雅地处理集合中可能找不到该项目的情况,您可以将 延迟到FirstOrDefault最后,如下所示:

var reversed = testList
    .Where(x => x == "hello")
    .Select(x => x.Reverse())
    .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

或者同等地

var reversed = testList
    .Where(x => x == "hello")
    .Select(Enumerable.Reverse)
    .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

null如果列表中没有满足方法中指定条件的项目,则返回此值Where。这里的性能差异最多可以忽略不计。它不需要循环遍历testList原始代码,因为一旦找到第一个元素,就会立即返回结果。