跳过 LINQ .Where 语句中的空序列
Skip an empty sequence inside a LINQ .Where statement
我有一个 元组 数组 的数组,如下所示:
(Type, Func<int, bool>)[][] Formats;
我还有一个Type typ
和一个int i
。
然后我需要一个 IEnumerable<(Type, Func<int,bool>[])>
(又名 return 项),其中潜在匹配由 Item1
(即 Type
)匹配 typ
来评估格式 .IsAssignableFrom(typ)
。如果我们得到一个匹配项,那么我们还没有完成:我们仅在 Item2.Invoke(i)
评估为真时包含它。
var results = Formats.Where(f => f.Where(o => o.Item1.IsAssignableFrom(typ)).First().Item2.Invoke(i));
这是无效的,因为我认为如果 return 项在 .First()
调用中没有要检索的内部项,它会抛出 InvalidOperationException
“序列不包含数据”,因为您不能在空序列上调用 .First()
。
你能帮忙重述这个 Linq 以忽略空序列吗?
这是使用 Enumerable.FirstOrDefault()
method:
的绝好机会
Returns the first element of a sequence, or a default value if no element is found.
在这种情况下,“默认值”将为 (null, null)
。因此,使用 FirstOrDefault()
而不是 First()
,然后适当地忽略项目。这样的事情可能会奏效:
var results = Formats.Where(f => f.Where(o => o.Item1.IsAssignableFrom(typ)).FirstOrDefault().Item2?.Invoke(i) ?? false);
我有一个 元组 数组 的数组,如下所示:
(Type, Func<int, bool>)[][] Formats;
我还有一个Type typ
和一个int i
。
然后我需要一个 IEnumerable<(Type, Func<int,bool>[])>
(又名 return 项),其中潜在匹配由 Item1
(即 Type
)匹配 typ
来评估格式 .IsAssignableFrom(typ)
。如果我们得到一个匹配项,那么我们还没有完成:我们仅在 Item2.Invoke(i)
评估为真时包含它。
var results = Formats.Where(f => f.Where(o => o.Item1.IsAssignableFrom(typ)).First().Item2.Invoke(i));
这是无效的,因为我认为如果 return 项在 .First()
调用中没有要检索的内部项,它会抛出 InvalidOperationException
“序列不包含数据”,因为您不能在空序列上调用 .First()
。
你能帮忙重述这个 Linq 以忽略空序列吗?
这是使用 Enumerable.FirstOrDefault()
method:
Returns the first element of a sequence, or a default value if no element is found.
在这种情况下,“默认值”将为 (null, null)
。因此,使用 FirstOrDefault()
而不是 First()
,然后适当地忽略项目。这样的事情可能会奏效:
var results = Formats.Where(f => f.Where(o => o.Item1.IsAssignableFrom(typ)).FirstOrDefault().Item2?.Invoke(i) ?? false);