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

ome*_*ega 8 .net c# 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

错误信息:

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

Jod*_*ell 19

好的,如果没有第一个是特殊的,

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

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

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


Sim*_*ger 7

null检查查找时,您不在谓词中.这条线

    foundItem = itemCollection.Find(item => item.item.ID == PDFID);
Run Code Online (Sandbox Code Playgroud)

可能会抛出异常它itemnull(有你插入一个null集合中的项目吗?),或者item.itemnull(你确定它总是在那里?).

你可以这样做:

foundItem = itemCollection.Find(item => item != null &&
                                        item.item != null && 
                                        item.item.ID == PDFID);
Run Code Online (Sandbox Code Playgroud)

更健谈,但你不会得到一个NullReferenceException.

编辑嗯,你改变了你的问题.现在你做First.如果找不到任何内容,该First方法抛出异常.使用FirstOrDefault而不是返回null一个类或一个默认值struct.

    foundItem = itemCollection.FirstOrDefault(item => item != null &&
                                              item.item != null && 
                                              item.item.ID == PDFID);
Run Code Online (Sandbox Code Playgroud)