Подтвердить что ты не робот

Linq выбирает объект из списка в зависимости от атрибута объектов

У меня есть список объектов

class Answer
{
   bool correct;
}

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

Есть ли способ в linq для меня выбрать объект в зависимости от его атрибута?

До сих пор у меня

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

Но это не работает

4b9b3361

Ответ 1

Во-первых, Single выдает исключение, если существует более одного элемента, удовлетворяющего критериям. Во-вторых, ваши критерии должны проверять только свойство Correct 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();

Ответ 2

Я предполагаю, что вы получаете исключение из-за Single. В вашем списке может быть более одного ответа, помеченного как правильное, поэтому Single будет использовать исключение First или FirstOrDefault();

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

Также, если вы хотите получить список всех элементов, отмеченных как правильные, вы можете попробовать:

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

Если ваш желаемый результат Single, ошибка, которую вы делаете в своем запросе, сравнивает элемент с значением bool. Ваше сравнение

a == a.Correct

неверно в инструкции. Ваш единственный запрос должен быть:

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

Или коротко, как:

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

Ответ 3

Ваше выражение никогда не будет оцениваться.

Вы сравниваете a с свойством a.

a имеет тип "Ответ". a.Correct, я предполагаю, что это boolean.

Длинная форма: -

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

Краткая форма: -

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

Ответ 4

если a.Correct является флагом bool для правильного ответа, тогда вам нужно.

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

Ответ 5

Я думаю, вы ищете это?

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

Вы можете использовать сингл, набрав:

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

Ответ 6

Конечно!

Используйте FirstOrDefault() для выбора первого объекта, который соответствует условию:

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

В противном случае используйте Where(), чтобы выбрать подмножество вашего списка:

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

Ответ 7

Немногие вещи, которые нужно исправить здесь:

  • В объявлении класса нет скобок
  • Сделать "правильное" свойство общедоступным
  • И затем сделайте выделение

Ваш код будет выглядеть примерно так.

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

Ответ 8

Answers = Answers.GroupBy(a => a.id).Select(x => x.First());

Это позволит выбрать каждый уникальный объект по электронной почте