2012-11-01 42 views
0

我有这个片段。列表lambda表达式抛出一个特定查询的InvalidOperationException

List<Frames> FrameList; 

其中,框架是只包含包括字符串字段“ExerciseID”的基元的类。

... 


void GetFramesForExercise(string exerciseID) 

    .... 

    if (exerciseID == "3.2.2") { 
     Console.Write(""); } // quick and dirty to add a breakpoint 

    if (FramesList[115].ExerciseID.Equals(exerciseID)) { 
     Console.Write(""); } // quick and dirty to add a breakpoint 

    frames = (Frames)FramesList.Single(r => r.ExerciseID.Equals(exerciseID)); 

通过把断点在console.write声明,我能看到exerciseID确实等于“3.2.2”和FramesList [115]点锻炼,ID为实例“3.2 .2" 。指出的实例正确启动。

为什么我的查询抛出InvalidOperationException?

+0

请张贴满异常消息 – empi

+0

应该没有必要投自'名单返回值''Frames'是强类型... – khellang

+0

什么的frameList和FramesList之间的区别 - 错字:) – Simon

回答

6

如果有多于一个匹配的元素,Single会抛出InvalidOperationException。 (正如你已经检查有在至少一个匹配,这是我可以看到,你会得到这个异常的唯一原因。)

this page例外部分。

+1

Grrrrr,该死的,*&%$ ^^,拍打着脸。谢谢!!!!!我从外部来源获取填充FramesList的XML,这些XML向我保证不可能有欺骗。你猜怎么了? – Simon

+1

好东西,你没有使用'第一',然后,或者你从来不知道:) – Rawling

+0

是的!我刚刚添加了一个新的异常类到我的XML解析器;) – Simon

3

FrameList可能没有单个实例匹配搜索条件。结果导致异常。

作为每MSDN文档Enumerable.Single

单返回序列中的唯一元件,并且如果存在的序列”在恰好一个要素是不抛出异常 。

1

您可以调用FirstOrDefault,而不是查询单个项目,也可以调用FirstOrDefault。当您依赖来自第三方xml文件的值时,该调用不会抛出异常。

+0

谢谢,但我接受Rawling的答案为最早,正确并正确地编码了我的假设。 – Simon

0

您应该使用First,Single您希望只返回一个元素。

frames = (Frames)FramesList.First(r => r.ExerciseID.Equals(exerciseID)); 
+0

谢谢,但我最早接受Rawling的答案,正确并正确地编码了我的假设。 – Simon