0

我有这个片段。

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

4 回答 4

6

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

请参阅本页的例外部分。

于 2012-11-01T11:24:31.907 回答
3

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

根据Enumerable.Single的 msdn 文档

Single 返回序列的唯一元素,如果序列中不完全有一个元素,则抛出异常”。

于 2012-11-01T11:25:53.937 回答
1

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

于 2012-11-01T11:31:12.520 回答
0

你应该First,Single是在你期望只返回一个元素的地方使用。

frames = (Frames)FramesList.First(r => r.ExerciseID.Equals(exerciseID));
于 2012-11-01T11:31:20.783 回答