跳过 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);