2012-11-05 15 views
13

Ich habe eine Liste von ObjektenLinq Objekt auswählen aus der Liste auf Objekte je Attribut

class Answer 
{ 
    bool correct; 
} 

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

Gibt es eine Möglichkeit in Linq für mich ein Objekt auszuwählen, auf dessen Attribut abhängig?

Bisher habe ich

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

Aber es funktioniert nicht

Antwort

35

Zuerst Single eine Ausnahme auslöst, wenn es mehr als ein Element ist, um die Kriterien zu erfüllen. Zweitens sollten Ihre Kriterien nur überprüfen, ob die Correct-Eigenschaft true ist. Im Moment prüfen Sie, ob a gleich a.Correct ist (was nicht einmal kompiliert wird).

sollten Sie verwenden First (was werfen, wenn es keine solche Elemente sind) oder FirstOrDefault (die null für eine Referenz-Typ zurück, wenn es nicht so Element ist):

// 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

Danke für die Erklärung –

2

wenn a.Correct ist ein bool Flag für die richtige Antwort dann brauchen Sie.

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

Ich gehe davon aus Sie eine Ausnahme erhalten wegen Single. Ihre Liste kann mehr als eine Antwort enthalten, die als richtig markiert ist. Deshalb wird Single eine Ausnahme verwenden First oder FirstOrDefault();

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

auch wollen, wenn Sie die Liste aller Einzelteile erhalten als korrekt markiert Sie können versuchen:

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

Wenn Ihr gewünschtes Ergebnis Single ist, dann ist der Fehler, den Sie in Ihrer Anfrage tun ein vergleicht Artikel mit dem Bool-Wert. Ihr Vergleich

a == a.Correct 

ist falsch in der Aussage. Ihre einzige Abfrage sollte sein:

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

oder kurz als:

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

Ich glaube, Sie sind für diese suchen?

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

Natürlich:

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

Sie können durch die Eingabe einer einzigen verwenden!

Verwenden FirstOrDefault() das erste Objekt auszuwählen, die die Bedingung erfüllt:

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

Ansonsten Where() verwenden, um eine Teilmenge der Liste auszuwählen:

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

Ihr Ausdruck wird nie zu bewerten.

Sie vergleichen a mit einer Eigenschaft von a.

a ist vom Typ Antwort. a.Correct, ich denke, ein Boolescher ist.

Langform: -

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

Kurzform: -

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

paar Dinge hier zu beheben:

  1. keine Klammer in Klassendeklaration
  2. Machen Sie das „richtige "Eigentum als öffentliche
  3. Und dann tun die Auswahl

Ihr Code wird

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

und die Klasse wie folgt aussehen

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

Dieses jede eindeutige Objekt per E-Mail wählen, wird

Verwandte Themen