オブジェクトのリストがあります
class Answer
{
bool correct;
}
List<Answer> Answers = new List<Answer>();
属性に応じてオブジェクトを選択する方法はありますか?
これまでのところ、
Answer answer = Answers.Single(a => a == a.Correct);
しかし、それは機能しません
まず、Single
基準を満たす要素が複数ある場合に例外をスローします。Correct
第 2 に、条件はプロパティが であるかどうかのみをチェックする必要がありますtrue
。現在、a
等しいかどうかをチェックしa.Correct
ています(コンパイルさえしません)。
First
(そのような要素がない場合はスローします)、または(そのような要素がない場合は参照型FirstOrDefault
を返します)を使用する必要があります。null
// this will return the first correct answer,
// or throw an exception if there are no correct answers
var correct = answers.First(a => a.Correct);
// this will return the first correct answer,
// or null if there are no correct answers
var correct = answers.FirstOrDefault(a => a.Correct);
// this will return a list containing all answers which are correct,
// or an empty list if there are no correct answers
var allCorrect = answers.Where(a => a.Correct).ToList();
シングルが原因で例外が発生していると思います。リストに正解としてマークされた複数の回答がある場合があります。そのため、FirstまたはFirstOrDefault()Single
を使用して例外をスローします。
Answer answer = Answers.FirstOrDefault(a => a.Correct);
また、正しいとマークされたすべてのアイテムのリストを取得したい場合は、次のことを試してください。
List<Answer> correctedAnswers = Answers.Where(a => a.Correct).ToList();
目的の結果がSingle
である場合、クエリで行っている間違いは、アイテムをブール値と比較することです。あなたの比較
a == a.Correct
ステートメントが間違っています。単一のクエリは次のようになります。
Answer answer = Answers.Single(a => a.Correct == true);
またはまもなく:
Answer answer = Answers.Single(a => a.Correct);
あなたの式は決して評価されません。
a
のプロパティと比較していますa
。
a
回答型です。 a.Correct
、ブール値だと思います。
長い形式:-
Answer = answer.SingleOrDefault(a => a.Correct == true);
ショートフォーム:-
Answer = answer.SingleOrDefault(a => a.Correct);
が正しい答えのフラグである場合a.Correct
は、bool
必要です。
Answer answer = Answers.Single(a => a.Correct);
あなたはこれを探していると思いますか?
var correctAnswer = Answers.First(a => a.Correct);
次のように入力すると、singleを使用できます。
var correctAnswer = Answers.Single(a => a.Correct);
もちろん!
FirstOrDefault()
条件に一致する最初のオブジェクトを選択するために使用します。
Answer answer = Answers.FirstOrDefault(a => a.Correct);
それ以外の場合は、を使用Where()
してリストのサブセットを選択します。
var answers = Answers.Where(a => a.Correct);
ここで修正すべき点はほとんどありません:
コードは次のようになります
List<Answer> answers = new List<Answer>();
/* test
answers.Add(new Answer() { correct = false });
answers.Add(new Answer() { correct = true });
answers.Add(new Answer() { correct = false });
*/
Answer answer = answers.Single(a => a.correct == true);
そしてクラス
class Answer
{
public bool correct;
}
Answers = Answers.GroupBy(a => a.id).Select(x => x.First());
これにより、電子メールで各一意のオブジェクトが選択されます