我有一个对象列表
class Answer
{
bool correct;
}
List<Answer> Answers = new List<Answer>();
linq 中是否有办法让我根据其属性选择对象?
到目前为止我有
Answer answer = Answers.Single(a => a == a.Correct);
但它不起作用
首先,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();
我假设你因为Single得到了一个例外。您的列表可能有多个标记为正确的答案,这就是为什么会使用First或FirstOrDefault()Single
引发异常;
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);
你的表达永远不会评估。
您正在a
与 的属性进行比较a
。
a
是答案类型。 a.Correct
,我猜是一个布尔值。
长表:-
Answer = answer.SingleOrDefault(a => a.Correct == true);
简写:-
Answer = answer.SingleOrDefault(a => a.Correct);
如果a.Correct
是bool
正确答案的标志,那么您需要。
Answer answer = Answers.Single(a => a.Correct);
我想你在找这个?
var correctAnswer = Answers.First(a => a.Correct);
您可以通过键入来使用单一:
var correctAnswer = Answers.Single(a => a.Correct);
当然!
用于FirstOrDefault()
选择符合条件的第一个对象:
Answer answer = Answers.FirstOrDefault(a => a.Correct);
否则用于Where()
选择列表的子集:
var answers = Answers.Where(a => a.Correct);
这里有几件事要解决:
你的代码看起来像这样
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;
}
Answers = Answers.GroupBy(a => a.id).Select(x => x.First());
这将通过电子邮件选择每个唯一对象