10

私は時々あるいくつかのlinqコードを持っていますnull:

        cbo3.ItemsSource = empty.Union(from a in
                                           (from b in CompleteData
                                            select b.TourOpID).Distinct()
                                       select new ComboBoxItemString() { ValueString = a.Value.ToString() });

しかしTourOpID、時々nullエラーが発生しa.Value.ToString()ます。これを解決するにはどうすればよいですか?

4

3 に答える 3

18

この問題は、タイプのValueプロパティにアクセスするために発生します(より正確には、プロパティは です)。これを修正する方法は、何をしたいかによって異なります。NullablenullHasValuefalse

  1. TourOpIDが null の項目を除外する場合は、次のwhere句を追加します。

    ...
    (from b in CompleteData
     where b.TourOpID != null         // filter
     select b.TourOpID).Distinct()
    ...
    
  2. 0if TourOpIDis null などの置換値を使用する場合は、 null 合体演算子 を使用して、あなたを に??変換します。int?int

    ...
    (from b in CompleteData
     select b.TourOpID ?? 0).Distinct()
    ...
    

    または、代わりに、

    ...
    select new ComboBoxItemString() { ValueString = a.GetValueOrDefault().ToString() });
    
  3. TourOpIDnull の場合に別の ComboBox エントリを表示するだけの場合は、三項演算子を使用し?:ます。

    ...
    select new ComboBoxItemString() { 
        ValueString = (a == null ? "no tour operator" : a.Value.ToString())
    });
    

    null の場合に空の文字列を表示したい場合a、解決策はさらに簡単です。

    ...
    select new ComboBoxItemString() { ValueString = a.ToString() });
    

    値がない場合、Nullable.ToStringは空の文字列を返すためです。

于 2013-05-19T10:55:07.423 に答える
1

使用するwhere

from b in CompleteData where b.TourOpID != null select b.TourOpID
于 2013-05-19T10:50:23.557 に答える
1

ValueString = a.ToString()の代わりに使用しないでくださいValueString = a.Value.ToString()。値がある場合aは、この値を文字列に返します。そうでない場合は、a.ToString()空の文字列を返します。

IEnumerable<decimal?> arr = new List<decimal?>
                                            {
                                                1m, 4m, null, 10m, 6m
                                            };

foreach (var @decimal in arr)
{
       Console.WriteLine(@decimal.ToString());
}

出力は次のとおりです。

1
4

10
6
于 2013-05-19T11:08:09.090 に答える