序列不匹配元素

时间:2015-07-10 09:54:53

标签: c#

我对异常有疑问。

我的客户说有时出现此错误消息:

  

序列不包含匹配元素。

但是当我从电脑上检查时,它没有任何问题。它有时发生在我的客户端。 在我检查了日志后,它说问题出在这行代码中:

 var firstRc = entity.Right.Components.First(r => r.CadastralObjectId == parentCadastralObjectId
                                && r.ValidityEndCaseId == null
                                && r.IsLive == false);

我应该尝试使用FirstOrDefault而不只是First吗?

5 个答案:

答案 0 :(得分:2)

如果给定的序列为空,

方法First会抛出InvalidOperationException

如果给定的序列为空,则方法FirstOrDefault返回default(T)

答案 1 :(得分:1)

如果找不到任何匹配的元素,

First()将抛出异常。所以使用FirstOrDefault(),如果没有匹配则返回元素类型的默认值(对于引用类型为null)物品被发现

更改为

var firstRc = entity.Right.Components.FirstOrDefault(r => r.CadastralObjectId == parentCadastralObjectId
                                                     && r.ValidityEndCaseId == null
                                                     && r.IsLive == false);

答案 2 :(得分:1)

您是否应该使用FirstFirstOrDefault取决于您是否认为应始终返回某些内容。

如果应该总是有东西然后使用First并且抛出异常是正确的。这是一个错误,没有任何内容,First将抛出一个正是你想要的异常。

如果预计有时会出现匹配,请使用FirstOrDefault,然后根据需要处理默认值(可能为空)。

哪种方式最适合您的应用程序,只有您可以回答。

答案 3 :(得分:0)

你应该更喜欢FirstOrDefault而不是First。 因为首先必须找到至少一个元素。

答案 4 :(得分:0)

仅当查询始终匹配至少一个元素且仅需要匹配组的第一个元素时,才使用First方法。如果序列为空,则该方法将抛出InvalidOperationException

如果您希望查询总是完全匹配一个元素,那么请使用Single方法。如果序列为空,或者序列包含多个元素,它将抛出InvalidOperationException

但是,如果预计有时查询可能不匹配任何元素,那么您应该使用FirstOrDefaultSingleOrDefault方法。如果序列为空,它们都将返回默认值。这意味着在引用类型的情况下,返回值将为null,因此您应该为null添加一些额外的检查。另外,请注意,如果序列包含多个元素,SingleOrDefault仍会抛出。