以下のサンプルコードがありますが、おそらくをより適切に使用することで、これをよりクリーンにする方法を知りたいと思っていますSelectMany()
。この時点で、QuestionList
プロパティはnullになりません。私が欲しいのは、answerRows
そうではないリストですnull
が、Questions
時にはそうなることもありnull
ます。
IEnumerable<IQuestion> questions = survey.QuestionList
.Where(q => q.Questions != null)
.SelectMany(q => q.Questions);
if(questions == null)
return null;
IEnumerable<IAnswerRow> answerRows = questions
.Where(q => q.AnswerRows != null)
.SelectMany(q => q.AnswerRows);
if(answerRows == null)
return null;
とNullについてのJonのコメントに興味があったので、エラーがどこにあるかをより簡単に確認するために、いくつかの偽のデータを使用して例を試しEnumerable.SelectMany
てみたかったのです。以下を参照してください。問題は、null参照を使用しないようにする必要があることでした。これは、実際に名前を読んだときに明らかです:(そして最後に物事をまとめました。SelectMany()
SelectMany()
SelectMany()
NullReferenceException
また、これを行っている間にtry { } catch() { }
、この例での使用は役に立たず、いつものようにJonSkeetが答えを持っていることに気付きました :)実行の延期。
したがって、行2の例外を確認したい場合は、関連する行1ビットをコメントアウトしてください:P、申し訳ありませんが、コード例を書き直さずにこのエラーを停止する方法を理解できませんでした。
using System;
using System.Collections.Generic;
using System.Linq;
namespace SelectManyExample
{
class Program
{
static void Main(string[] args)
{
var questionGroupList1 = new List<QuestionGroup>() {
new QuestionGroup() {
Questions = new List<Question>() {
new Question() {
AnswerRows = new List<AnswerRow>() {
new AnswerRow(),
new AnswerRow()
}
},
// empty question, causes cascading SelectMany to throw a NullReferenceException
null,
new Question() {
AnswerRows = new List<AnswerRow>() {
new AnswerRow() {
Answers = new List<Answer>() {
new Answer(),
new Answer()
}
}
}
}
}
}
};
var questionGroupList2 = new List<QuestionGroup>() {
null,
new QuestionGroup()
};
IEnumerable<AnswerRow> answerRows1 = null;
IEnumerable<AnswerRow> answerRows2 = null;
try
{
answerRows1 = questionGroupList1
.SelectMany(q => q.Questions)
.SelectMany(q => q.AnswerRows);
}
catch(Exception e) {
Console.WriteLine("row 1 error = " + e.Message);
}
try
{
answerRows2 = questionGroupList2
.SelectMany(q => q.Questions)
.SelectMany(q => q.AnswerRows);
}
catch (Exception e)
{
Console.WriteLine("row 2 error = " + e.Message);
}
Console.WriteLine("row 1: " + answerRows1.Count());
Console.WriteLine("row 2: " + answerRows2.Count());
Console.ReadLine();
}
}
public class QuestionGroup {
public IEnumerable<Question> Questions { get; set; }
}
public class Question {
public IEnumerable<AnswerRow> AnswerRows { get; set; }
}
public class AnswerRow {
public IEnumerable<Answer> Answers { get; set; }
}
public class Answer {
public string Name { get; set; }
}
}