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ます。(一致するものが少なくとも1つあることを確認したので、これが、この例外が発生することがわかる唯一の理由です。)

このページの「例外」セクションを参照してください。

于 2012-11-01T11:24:31.907 に答える
3

FrameListには、検索基準に一致する単一のインスタンスがない場合があります。結果として例外が発生します。

Enumerable.Singleのmsdnドキュメントによる

Singleはシーケンスの唯一の要素を返し、シーケンスに要素が1つだけではない場合は例外をスローします。

于 2012-11-01T11:25:53.937 に答える
1

単一のアイテムをクエリする代わりに、FirstOrDefaultを呼び出すこともできます。サードパーティのxmlファイルの値に依存している場合、その呼び出しは例外をスローしません。

于 2012-11-01T11:31:12.520 に答える
0

必要なFirstSingleは、単一の要素のみが返されることを期待する場合に使用することです。

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