1

私はしばらくグーグルで検索し、問題に対してさまざまなタイプの組み合わせを試しました。

Gridview に Anonymous 型の結果を入力したいと考えています。すべての変数に実際の値があるため、「ループ」の最初の実行はうまくいきます。

しかし、行番号 2 のスローを埋める 2 回目:オブジェクト参照がオブジェクトのインスタンスに設定されていません。

これは、おそらく匿名オブジェクトをnullに割り当て、グリッドビューがそれを処理できないためです。私はいくつかの解決策を見つけようとしましたが、まだ何もうまくいきません。

LinQ を正しく理解するための秘密の通路はありますか?

これは今私のコードです:

var filteredlist = from info in list // List from external
                   select new
                   {
                       Question = info.QuestionText ?? "Test",
                       CorrectAnswer = info.CorrectAnswer.OptionText ?? "Test",
                       WrongAnswer1 = info.WrongAnswer1.OptionText ?? "Test",
                       WrongAnswer2 = info.WrongAnswer2.OptionText ?? "Test", //Throws Error
                       WrongAnswer3 = info.WrongAnswer3.OptionText ?? "Test" //Throws Error
                   };

GridView1.DataSource = filteredlist;
GridView1.DataBind();

これは、それを機能させるための私の試みです。

var filteredlist = from info in list // list from external
                   select new
                   {
                       Question = info.QuestionText == null ? "Test" : info.QuestionText,
                       CorrectAnswer = info.CorrectAnswer.OptionText == null ? "Test" : info.CorrectAnswer.OptionText,
                       WrongAnswer1 = info.WrongAnswer1.OptionText == null ? "Test" : info.WrongAnswer1.OptionText,
                       WrongAnswer2 = info.WrongAnswer2.OptionText == null ?  "Test" : info.WrongAnswer2.OptionText, //Throws Error
                       WrongAnswer3 = info.WrongAnswer3.OptionText == null ? "Test" : info.WrongAnswer3.OptionText, //Throws Error
                   };


GridView1.DataSource = filteredlist;
GridView1.DataBind();

2 回目の試行

var filteredlist = from info in list // list from external
                   select new
                   {
                       Question = info.QuestionText != null ? "Test" : info.QuestionText,
                       CorrectAnswer = info.CorrectAnswer.OptionText != null ? "Test" : info.CorrectAnswer.OptionText,
                       WrongAnswer1 = info.WrongAnswer1.OptionText != null ? "Test" : info.WrongAnswer1.OptionText,
                       WrongAnswer2 = info.WrongAnswer2.OptionText != null ? "Test" : info.WrongAnswer2.OptionText, //Throws Error
                       WrongAnswer3 = info.WrongAnswer3.OptionText != null ? "Test" : info.WrongAnswer3.OptionText, //Throws Error
                   };

GridView1.DataSource = filteredlist;
GridView1.DataBind();
4

3 に答える 3

5

WrongAnswer次のように、s が null でないかどうかを確認してください。

from info in list
where info != null
select new
{
    Question = info.QuestionText ?? "Test",
    CorrectAnswer = info.CorrectAnswer.OptionText ?? "Test",
    WrongAnswer1  = info.WrongAnswer1 !=null ? info.WrongAnswer1.OptionText : "Test",
    WrongAnswer2  = info.WrongAnswer2 !=null ? info.WrongAnswer2.OptionText : "Test", 
    WrongAnswer3  = info.WrongAnswer3 !=null ? info.WrongAnswer3.OptionText : "Test"
};

次のように、読みやすさのために汎用メソッドを使用するのが大好きです。

public string DefaultIfNull<TValue>(TValue value, Func<TValue, string> selector) where TValue : class
{
    if(value != null)
        return selector(value);
    return "Test"; //you can make resut generic too
}   

次のことができるようになりました。

Func<Answer,string> optionTextSelector = answer => answer.OptionText;

from info in list
where info != null
select new
{
    Question = info.QuestionText ?? "Test",
    CorrectAnswer = DefaultIfNull( info.CorrectAnswer, optionTextSelector ),
    WrongAnswer1  = DefaultIfNull( info.WrongAnswer1,  optionTextSelector ),
    WrongAnswer2  = DefaultIfNull( info.WrongAnswer2,  optionTextSelector ),
    WrongAnswer3  = DefaultIfNull( info.WrongAnswer3,  optionTextSelector ),
};

主なアイデアは、関数型アプローチを使用して難読化したり、ソリューションを複雑にしすぎたりしないことです。

于 2013-03-21T11:33:17.850 に答える
0

info.WrongAnswer2可能性が最も高いnullです。試す:

WrongAnswer2 = info.WrongAnswer2 == null ? "Nothing To See Here" : 
    info.WrongAnswer2.OptionText ?? "Test"

同様にinfo.WrongAnswer3

于 2013-03-21T11:32:41.967 に答える
0

おそらく間違ったプロパティをチェックしています。をチェックする前にinfo.WrongAnswer2とをチェックしてみてください。info.WrongAnswer3OptionText

于 2013-03-21T11:33:11.847 に答える