Enumerable.Last()抛出InvalidOperationException“;序列不包含匹配元素“;

本文关键字:包含匹 元素 Last 抛出 InvalidOperationException Enumerable | 更新日期: 2023-09-27 18:21:46

在预先排序的List<int>中,我将找到最后一个满足条件的元素,例如int lastScore = list.Last(x => x < 100)。如果列表中没有满足此条件的元素,则抛出一个InvalidOperationException,并显示错误消息:Sequence contains no matching elementlist.First(...)也会出现这种情况。

我甚至试图使lastScore可以为null,但没有成功。

捕获异常并手动将lastScore分配给null是唯一的出路吗?

Enumerable.Last()抛出InvalidOperationException“;序列不包含匹配元素“;

如果不匹配,则使用FirstOrDefaultLastOrDefault获取null,假设您使用的是引用类型。这些方法将返回值类型的默认值。

我可能只是在最近的使用点捕获异常。

这是因为IEnumerable<int>上的LastOrDefault/FirstOrDefault将返回0(int的默认值),可能是"有效"值-这取决于实际上下文和定义的规则。虽然将序列转换为IEnumerable<int?>将允许前面的方法返回null,但这似乎比它的价值更大。

如果需要继续使用lastScore,请考虑:

int? lastScore;  /* Using a Nullable<int> to be able to detect "not found" */
try {
   lastScore = list.Last(x => x < 100);  /* int -> int? OK */
} catch (InvalidOperationException) {
   lastScore = null; /* If 0 see LastOrDefault as suggested;
                        otherwise react appropriately with a sentinel/flag/etc */
}
if (lastScore.HasValue) {
   /* Found value meeting conditions */
}

或者,如果能够在找不到的情况下丢弃案例,请考虑:

try {
   var lastScore = list.Last(x => x < 100);
   /* Do something small/immediate that won't throw
      an InvalidOperationException, or wrap it in it's own catch */
   return lastScore * bonus;
} catch (InvalidOperationException) {
   /* Do something else entirely, lastScore is never available */
   return -1;
}