我有以下语句,它总是返回null:
var addins = allocations.SelectMany(
set => set.locations.Any(q => q.IsMatch(level, count))
? (List<string>)set.addins : null
);
我稍微改了一下,现在工作正常:
var addins = allocations.SelectMany(
set => set.locations.Any(q => q.IsMatch(level, count))
? set.addins : new List<string>()
);
我的主要问题:为什么在LINQ的这个上下文中,null不能作为三元运算符的返回类型?
第二个问题:是否有更聪明的方法来制定上述查询(特别是如果它消除了“新的List()”)?
答案 0 :(得分: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>()
);
我怀疑你真正想要的只是在SelectMany之前调用Where来过滤掉你不想要的集合:
var addins = allocations
.Where(set => set.locations.Any(q => q.IsMatch(level, count)))
.SelectMany(set => (List<string>)set.addins);
或者,在查询语法中:
var addins =
from set in allocations
where set.locations.Any(q => q.IsMatch(level, count))
from addin in (List<string>)set.addins
select addin;
答案 1 :(得分:1)
制作:
(List<string>)set.addins : (List<string>)null