Linq выбирает объект из списка в зависимости от атрибута объектов
У меня есть список объектов
class Answer
{
bool correct;
}
List<Answer> Answers = new List<Answer>();
Есть ли способ в linq для меня выбрать объект в зависимости от его атрибута?
До сих пор у меня
Answer answer = Answers.Single(a => a == a.Correct);
Но это не работает
Ответы
Ответ 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());
Это позволит выбрать каждый уникальный объект по электронной почте