22

オブジェクトのリストがあります

class Answer
{
   bool correct;
}

List<Answer> Answers = new List<Answer>();

属性に応じてオブジェクトを選択する方法はありますか?

これまでのところ、

Answer answer = Answers.Single(a => a == a.Correct);

しかし、それは機能しません

4

8 に答える 8

60

まず、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();
于 2012-11-05T10:47:09.770 に答える
15

シングルが原因で例外が発生していると思います。リストに正解としてマークされた複数の回答がある場合があります。そのため、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);
于 2012-11-05T10:47:25.063 に答える
5

あなたの式は決して評価されません。

aのプロパティと比較していますa

a回答型です。 a.Correct、ブール値だと思います。

長い形式:-

Answer = answer.SingleOrDefault(a => a.Correct == true);

ショートフォーム:-

Answer = answer.SingleOrDefault(a => a.Correct);
于 2012-11-05T10:49:42.243 に答える
2

が正しい答えのフラグである場合a.Correctは、bool必要です。

Answer answer = Answers.Single(a => a.Correct);
于 2012-11-05T10:47:13.087 に答える
1

あなたはこれを探していると思いますか?

var correctAnswer = Answers.First(a => a.Correct);

次のように入力すると、singleを使用できます。

var correctAnswer = Answers.Single(a => a.Correct);
于 2012-11-05T10:47:55.983 に答える
1

もちろん!

FirstOrDefault()条件に一致する最初のオブジェクトを選択するために使用します。

Answer answer = Answers.FirstOrDefault(a => a.Correct);

それ以外の場合は、を使用Where()してリストのサブセットを選択します。

var answers = Answers.Where(a => a.Correct);
于 2012-11-05T10:49:07.090 に答える
0

ここで修正すべき点はほとんどありません:

  1. クラス宣言に括弧がありません
  2. 「正しい」プロパティを公開する
  3. そして、選択を行います

コードは次のようになります

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;
}
于 2012-11-05T10:53:46.590 に答える
0
Answers = Answers.GroupBy(a => a.id).Select(x => x.First());

これにより、電子メールで各一意のオブジェクトが選択されます

于 2014-06-27T16:33:48.897 に答える