Enumerable.Last()抛出InvalidOperationException" Sequence不包含匹配元素"

时间:2014-09-13 04:54:29

标签: c# .net linq

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

我甚至试图使lastScore可以无效。

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

2 个答案:

答案 0 :(得分:3)

如果没有匹配,请使用FirstOrDefaultLastOrDefault获取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;
}