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

Wes*_*een 18 c# linq

我有一个对象列表

class Answer
{
   bool correct;
}

List<Answer> Answers = new List<Answer>();
Run Code Online (Sandbox Code Playgroud)

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

到目前为止我有

Answer answer = Answers.Single(a => a == a.Correct);
Run Code Online (Sandbox Code Playgroud)

但它不起作用

Gro*_*roo 48

首先,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();
Run Code Online (Sandbox Code Playgroud)


Hab*_*bib 12

我假设你因为单身而得到例外.您的列表可能有多个标记为正确的答案,这就是为什么Single抛出异常使用FirstFirstOrDefault() ;

Answer answer = Answers.FirstOrDefault(a => a.Correct);
Run Code Online (Sandbox Code Playgroud)

此外,如果您想获得标记为正确的所有项目的列表,您可以尝试:

List<Answer> correctedAnswers =  Answers.Where(a => a.Correct).ToList();
Run Code Online (Sandbox Code Playgroud)

如果您需要的结果是Single,那么您在查询中所犯的错误就是将项目与bool值进行比较.你的比较

a == a.Correct
Run Code Online (Sandbox Code Playgroud)

声明中的错误.您的单个查询应该是:

Answer answer = Answers.Single(a => a.Correct == true);
Run Code Online (Sandbox Code Playgroud)

或者很快:

Answer answer = Answers.Single(a => a.Correct);
Run Code Online (Sandbox Code Playgroud)


Pau*_*lor 5

你的表达永远不会评估。

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

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

长表:-

Answer = answer.SingleOrDefault(a => a.Correct == true);
Run Code Online (Sandbox Code Playgroud)

简写:-

Answer = answer.SingleOrDefault(a => a.Correct);
Run Code Online (Sandbox Code Playgroud)