2012-11-05 15 views

Odpowiedz

35

Najpierw Single zgłasza wyjątek, jeśli istnieje więcej niż jeden element spełniający kryteria. Po drugie, twoje kryteria powinny tylko sprawdzić, czy właściwość Correct to true. W tej chwili sprawdzasz, czy a jest równe a.Correct (który nie będzie nawet kompilował).

Należy użyć First (który rzuci jeśli nie ma takich elementów) lub FirstOrDefault (który powróci null dla typu referencyjnego, jeżeli nie ma takiego elementu):

// 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(); 
+1

Dziękuję za wyjaśnienie –

2

jeśli a.Correct jest flaga bool dla poprawnej odpowiedzi, wtedy potrzebujesz.

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

Zakładam, że otrzymujesz wyjątek z powodu Single. Twoja lista może zawierać więcej niż jedną odpowiedź oznaczoną jako poprawna, dlatego Single będzie zgłaszać użycie wyjątku: First lub FirstOrDefault();

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

Także jeśli chcesz uzyskać listę wszystkich elementów oznaczonych jako poprawna można spróbować:

List<Answer> correctedAnswers = Answers.Where(a => a.Correct).ToList(); 

Jeśli żądany wynik jest Single, to pomyłka robisz w zapytaniu jest porównywania pozycja z wartością bool. Twoje porównanie

a == a.Correct 

jest nieprawidłowe w wyciągu. Twój jedno zapytanie powinno być:

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

lub krótko jako:

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

myślę szukasz to?

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

Można użyć pojedynczego wpisując:

var correctAnswer = Answers.Single(a => a.Correct); 
1

oczywiście!

Zastosowanie FirstOrDefault() zaznaczyć pierwszy obiekt, który odpowiada warunek:

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

inny sposób wykorzystywać Where() aby wybrać podzbiór listy:

var answers = Answers.Where(a => a.Correct); 
4

wyrażenia nigdy nie jest zamiar oceniać.

Porównułeś a z właściwością a.

a jest typu Odpowiedź. a.Correct, Zgaduję, że jest boolean.

Długa forma: -

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

Krótka forma: -

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

Niewiele rzeczy do poprawienia tutaj:

  1. Nie nawias w deklaracji klasy
  2. Marka „poprawny "Właściwość jako publiczna
  3. a następnie wykonaj wybór za

Twój kod będzie wyglądać następująco

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); 

i klasy

class Answer 
{ 
    public bool correct; 
} 
0
Answers = Answers.GroupBy(a => a.id).Select(x => x.First()); 

To będzie wybrać każdą unikalny obiekt email

Powiązane problemy