为什么Null是无效的LINQ投影?

Bre*_*ias 6 c# linq

我有以下语句,它始终返回null:

var addins = allocations.SelectMany(
        set => set.locations.Any(q => q.IsMatch(level, count))
        ? (List<string>)set.addins : null
     );
Run Code Online (Sandbox Code Playgroud)

我稍微改了一下,现在工作正常:

var addins = allocations.SelectMany(
        set => set.locations.Any(q => q.IsMatch(level, count))
        ? set.addins : new List<string>()
     );
Run Code Online (Sandbox Code Playgroud)

我的主要问题:为什么在LINQ的上下文中,null不能作为三元运算符的返回类型?

次要问题:有没有更聪明的方法来制定上述查询(特别是如果它消除了"新名单()")?

Qua*_*ter 11

Enumerable.SelectMany将尝试枚举lambda返回的序列,并抛出NullReferenceException尝试在null上调用GetEnumerator().您需要提供实际的空序列.您可以使用Enumerable.Empty而不是创建新列表:

var addins = allocations.SelectMany(
    set => set.locations.Any(q => q.IsMatch(level, count))
    ? (List<string>)set.addins : Enumerable.Empty<string>()
    );
Run Code Online (Sandbox Code Playgroud)

我怀疑你真正想要的是在SelectMany之前调用Where来过滤掉你不想要的集合:

var addins = allocations
    .Where(set => set.locations.Any(q => q.IsMatch(level, count)))
    .SelectMany(set => (List<string>)set.addins);
Run Code Online (Sandbox Code Playgroud)

或者,在查询语法中:

var addins =
    from set in allocations
    where set.locations.Any(q => q.IsMatch(level, count))
    from addin in (List<string>)set.addins
    select addin;
Run Code Online (Sandbox Code Playgroud)