Linq根据对象属性从列表中选择对象

时间:2012-11-05 10:45:23

标签: c# linq

我有一个对象列表

class Answer
{
   bool correct;
}

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

linq中有没有办法根据属性选择一个对象?

到目前为止我已经

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

但它不起作用

8 个答案:

答案 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将使用FirstFirstOrDefault()引发异常的原因;

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)

你的表达永远不会评估。

您正在将aa的属性进行比较。

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)

这里要解决的问题很少:

  1. 班级宣言中没有括号
  2. 将“正确”属性设为公开
  3. 然后进行选择
  4. 您的代码看起来像这样

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

这将通过电子邮件选择每个唯一对象