如何在c#中的List.First中处理没有匹配的情况?

时间:2013-07-04 14:32:01

标签: c# .net linq

IEnumerable.First函数中,如果没有匹配项,我该如何处理?目前它只是崩溃......

MySPListItem firstItem = itemCollection.First(item => !item.isFolder);
if (firstItem != null)
{
    TreeNode firstNode = GetNodeByListItem(my_treeview.Nodes, firstItem, ReportObject);
    if (firstNode != null)
    {
        ReportObject.log("Selecting the first PDF");
        selectPDF(my_treeview, firstNode, queryStr_param);
    }
}

错误讯息:

  

序列不包含匹配元素
  Stacktrace:at System.Linq.Enumerable.First [TSource](IEnumerable 1 source, Func 2   谓词)

6 个答案:

答案 0 :(得分:19)

好的,如果异常没有第一个

try
{
    var first = enumerable.First();
}
catch (InvalidOperationException)
{
    // Oops, that was exceptional.
}

如果您预计在某些有效情况下可能没有第一个,

var first = enumerable.FirstOrDefault();
if (first == default(someType)) // null for reference types.
{
    // Ok, I need to deal with that.
}

答案 1 :(得分:7)

当你对查找进行null检查时,你的谓词中没有。这条线

    foundItem = itemCollection.Find(item => item.item.ID == PDFID);

可能会抛出itemnull的例外(您是否在集合中插入了null项?)或item.itemnull(是你)确定它总是存在吗?)。

你可以这样做:

foundItem = itemCollection.Find(item => item != null &&
                                        item.item != null && 
                                        item.item.ID == PDFID);

更健谈,但你不会得到NullReferenceException

编辑您改变了问题。现在你做First。如果找不到任何内容,First方法抛出异常。请使用FirstOrDefault代替null来获取某个类,或使用struct的默认值。

    foundItem = itemCollection.FirstOrDefault(item => item != null &&
                                              item.item != null && 
                                              item.item.ID == PDFID);

答案 2 :(得分:3)

首先替换FirstOrDefault

MySPListItem firstItem = itemCollection.FirstOrDefault(item => !item.isFolder);

答案 3 :(得分:2)

引用您链接到的MSDN website

  

匹配指定谓词定义的条件的第一个元素(如果找到);否则,类型T的默认值。

这描述了返回值。因此,如果未找到匹配项,则会返回类型default的{​​{1}}值,这意味着T代表参考类型,以及诸如null,{{1}之类的内容}&合。对于价值类型。

所以在你的调用代码中,只需检查这个默认值,你就可以了:-)。您不能做的只是使用返回的值,例如如果您使用的是引用类型,则可能会生成0

答案 4 :(得分:0)

检查结果是否为null

   if (result == null)
   {
      Console.WriteLine("Not found");
   }

有一个明确的例子说明如果找到/找不到项目该怎么办here

答案 5 :(得分:0)

它不应该抛出异常,你需要处理它返回默认值(T)的情况。您可能会收到NullReferenceException,因为您没有处理返回null的情况。例如:

IEnumerable<Cars> cars = GetCars();
Car car = cars.Find(c => c.Model == "Astra");
if(car != null) 
{
   // You found a car!
}

如果您对结构执行相同操作,则会检查它是否为默认值。例如,Ints将是0:

int[] ints = new int[] { 1, 4, 7 };
int myInt = ints.Find(i => i > 5);
if(myInt != 0) // 0 is default(int)
{
   // You found a number
}