列出lambda表达式,为一个特定查询抛出InvalidOperationException

时间:2012-11-01 11:20:39

标签: c# linq-to-objects

我有这个片段。

List<Frames> FrameList;

其中Frames是一个只包含字符串的类,包括字符串字段“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”的Exercise实例。指向的实例已正确启动。

为什么我的查询会抛出InvalidOperationException?

4 个答案:

答案 0 :(得分:6)

如果有多个匹配元素,Single会抛出InvalidOperationException。 (正如您所检查的那样,至少匹配的那个,这是我可以看到您获得此异常的唯一原因。)

请参阅this page的例外部分。

答案 1 :(得分:3)

FrameList可能没有与搜索条件匹配的单个实例。因而导致异常。

根据 Enumerable.Single

的msdn文档
  

Single返回序列的唯一元素,并抛出异常   如果序列中没有一个元素“。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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