LINQ:按id从对象数组中选择单个值

sfi*_*_29 -1 c# linq arrays class object

采用以下示例类:

public class Questions
{
    public Int32 QuestionId { get; set; }
    public String Question { get; set; }
    public String Answer { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

以下数组:

var questionArray = new Questions[]
{
    new Questions {QuestionId = 1, Question = "How old are you?", Answer = "32"},
    new Questions {QuestionId = 2, Question = "What is your name?", Answer = "John"},
    new Questions {QuestionId = 3, Question = "How tall are you?", Answer = "6'"}
};
Run Code Online (Sandbox Code Playgroud)

使用LINQ,我想得到Answer指定的QuestionId.例如,如果我给QuestionId2,结果将是'John'.

我希望能够提出一个特定问题的答案来填充一个单独的DTO.即:

var person = new PersonDto {Name = <single line LINQ goes here>};
Run Code Online (Sandbox Code Playgroud)

到目前为止,我只能使用以下方法获得答案:

foreach (var q in questionArray.Where(q => q.QuestionId == 2))
{
    var answer = q.Answer;
}
Run Code Online (Sandbox Code Playgroud)

这可能在一行代码中吗?

Kam*_*ski 8

例如Single来自Linq的可能Single会在有多个答案时抛出异常.

var answer = questionArray.Single(x=>x.QuestionId == 2).Answer;
Run Code Online (Sandbox Code Playgroud)

这个答案假定一个问题只有一个答案(并且总是存在).SingleOrDefault如果您不确定是否存在答案,则可以添加并检查null.或者您可以添加Where子句以获得多个答案,例如:

var answers = questionArray.Where(x=>x.QuestionId == 2).Select(x=>x.Answer);
Run Code Online (Sandbox Code Playgroud)

如果没有问题的答案,上面的片段不会失败,它将返回空序列.您可以测试它是否有值并First在其上运行.