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 element
。list.First(...)
也会出现这种情况。
我甚至试图使lastScore
可以为null,但没有成功。
捕获异常并手动将lastScore
分配给null
是唯一的出路吗?
如果不匹配,则使用FirstOrDefault
或LastOrDefault
获取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;
}