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

qfe3c7zg  于 2023-09-28  发布在  其他
关注(0)|答案(3)|浏览(130)

有没有一个linq lambda搜索方法在搜索列表时返回null,而不是抛出异常?
我目前的解决方案是这样的:(避免抛出异常)

if (list.Exists(x => x.Foo == Foo))
{
    var listItem = list.Find(x => x.Foo == Foo);
}

只是重复这个表达感觉不对。
就像...

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

我感觉好多了还是只有我这么觉得
你有更好的方法吗?(解决方案不一定要返回null,只要有更好的解决方案就好)

gtlvzcf8

gtlvzcf81#

var listItem = list.FirstOrDefault(x => x.Foo == Foo);
if (listItem != null)
{
    //Do stuff
}
l3zydbqr

l3zydbqr2#

巴拉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
}
ftf50wuq

ftf50wuq3#

Find不会trow异常,除非 predicate 为null。

你可以使用“is”操作符:)

List<T> list = new List<T>();
  if (list.Find(x => x.Foo == Foo) is T yourObject)
  {
     //do stuff with yourObject.
  }

Find返回第一个与指定 predicate 定义的条件相匹配的元素(如果找到);否则为类型T的默认值。
所以你可以用FirstOrDefault得到同样的结果

List<T> list;
  if (list.FirstOrDefault(x => x.Foo == Foo) is T yourObject)
  {
     //do stuff with yourObject.
  }

相关问题