在预先排序的List<int>
中,我即将找到满足条件的最后一个元素,例如int lastScore = list.Last(x => x < 100)
。如果列表中没有满足此条件的元素,则会抛出InvalidOperationException
,并显示错误消息:Sequence contains no matching element
。这也发生在list.First(...)
上。
我甚至试图使lastScore
可以无效。
是否捕获异常并手动将lastScore
分配给null
唯一的出路?
答案 0 :(得分:3)
如果没有匹配,请使用FirstOrDefault
或LastOrDefault
获取null
,假设您使用的是引用类型。这些方法将为值类型返回default value。
答案 1 :(得分:0)
我可能只是在最近的使用点捕获异常。
这是因为LastOrDefault/FirstOrDefault
超过IEnumerable<int>
将返回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;
}