在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](IEnumerable1 source, Func
2 谓词)
答案 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);
可能会抛出item
为null
的例外(您是否在集合中插入了null
项?)或item.item
是null
(是你)确定它总是存在吗?)。
你可以这样做:
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)
答案 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
}