我有一个对象列表
class Answer
{
bool correct;
}
List<Answer> Answers = new List<Answer>();
linq中有没有办法根据属性选择一个对象?
到目前为止我已经
了Answer answer = Answers.Single(a => a == a.Correct);
但它不起作用
答案 0 :(得分:45)
首先,如果有多个元素满足条件,则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();
答案 1 :(得分:11)
我认为你因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);
答案 2 :(得分:4)
你的表达永远不会评估。
您正在将a
与a
的属性进行比较。
a
的类型为答案。 a.Correct
,我猜是布尔值。
长篇: -
Answer = answer.SingleOrDefault(a => a.Correct == true);
简短形式: -
Answer = answer.SingleOrDefault(a => a.Correct);
答案 3 :(得分:2)
如果a.Correct
是正确答案的bool
标志,那么您需要。
Answer answer = Answers.Single(a => a.Correct);
答案 4 :(得分:1)
我认为你在寻找这个?
var correctAnswer = Answers.First(a => a.Correct);
您可以通过输入以下来使用单身:
var correctAnswer = Answers.Single(a => a.Correct);
答案 5 :(得分:1)
当然!
使用FirstOrDefault()
选择与条件匹配的第一个对象:
Answer answer = Answers.FirstOrDefault(a => a.Correct);
否则,请使用Where()
选择列表的子集:
var answers = Answers.Where(a => a.Correct);
答案 6 :(得分:0)
这里要解决的问题很少:
您的代码看起来像这样
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;
}
答案 7 :(得分:0)
Answers = Answers.GroupBy(a => a.id).Select(x => x.First());
这将通过电子邮件选择每个唯一对象