Find()和First()抛出异常,如何返回null?

Ben*_*ler 61 .net c# linq lambda

在搜索列表时是否有一个linq lambda搜索方法返回null,而不是抛出异常?

我目前的解决方案是这样的:(以避免被抛出异常)

if (list.Exists(x => x.Foo == Foo))
{
    var listItem = list.Find(x => x.Foo == Foo);
}
Run Code Online (Sandbox Code Playgroud)

重复表达只是感觉不对.

就像是 ...

var listItem = list.Find(x => x.Foo == Foo);
if (listItem != null)
{
    //Do stuff
}
Run Code Online (Sandbox Code Playgroud)

......对我来说感觉更好 还是只是我?

你有更好的方法吗?(解决方案不必返回null,只是更好的解决方案是好的)

Bal*_*a R 121

var listItem = list.FirstOrDefault(x => x.Foo == Foo);
if (listItem != null)
{
    //Do stuff
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是不正确的,列表是引用类型,而不是值类型。我犹豫是否要对这样一个古老的、高度投票、高度关注的问题写评论。例如:如果列表包含属于类的对象,则列表项将返回默认值(类的实例),即新的类,该类将不为空!请参阅 [Bazzz 的](/sf/ask/392941041/#answer-5613548) 答案:https://stackoverflow。 com/questions/5613443/find-and-first-throws-exceptions-how-to-return-null-instead#answer-5613548 (2认同)

Baz*_*zzz 43

Bala R的回答是正确的,我只是想添加一条信息:

请注意,如果List<T>包含副设计的对象不能为null,FirstOrDefault则返回的内容不是null.编译器可能会在if语句中给出警告/错误.在这种情况下,你应该像这样处理你的情况:

List<MyObjectThatCannotBeNull> list;
var listItem = list.FirstOrDefault(x => x.Foo == Foo);
if (!listItem.Equals(default(MyObjectThatCannotBeNull)))
{
    //Do stuff
}
Run Code Online (Sandbox Code Playgroud)

  • 并且不要忘记 - 如果您的列表将包含该泛型类型的默认值([默认值表](http://msdn.microsoft.com/en-us/library/83fhsxwc.aspx)),您无法分辨如果值存在或不使用`Find`方法.在这些情况下你应该使用`FindIndex`,`Exists`或`Contains`. (7认同)