22

我有一个对象列表

class Answer
{
   bool correct;
}

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

linq 中是否有办法让我根据其属性选择对象?

到目前为止我有

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

但它不起作用

4

8 回答 8

60

首先,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();
于 2012-11-05T10:47:09.770 回答
15

我假设你因为Single得到了一个例外。您的列表可能有多个标记为正确的答案,这就是为什么会使用FirstFirstOrDefault()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);
于 2012-11-05T10:47:25.063 回答
5

你的表达永远不会评估。

您正在a与 的属性进行比较a

a是答案类型。 a.Correct,我猜是一个布尔值。

长表:-

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

简写:-

Answer = answer.SingleOrDefault(a => a.Correct);
于 2012-11-05T10:49:42.243 回答
2

如果a.Correctbool正确答案的标志,那么您需要。

Answer answer = Answers.Single(a => a.Correct);
于 2012-11-05T10:47:13.087 回答
1

我想你在找这个?

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

您可以通过键入来使用单一:

var correctAnswer = Answers.Single(a => a.Correct);
于 2012-11-05T10:47:55.983 回答
1

当然!

用于FirstOrDefault()选择符合条件的第一个对象:

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

否则用于Where()选择列表的子集:

var answers = Answers.Where(a => a.Correct);
于 2012-11-05T10:49:07.090 回答
0

这里有几件事要解决:

  1. 类声明中没有括号
  2. 将“正确”的属性设为公开
  3. 然后进行选择

你的代码看起来像这样

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;
}
于 2012-11-05T10:53:46.590 回答
0
Answers = Answers.GroupBy(a => a.id).Select(x => x.First());

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

于 2014-06-27T16:33:48.897 回答