2013-05-19 109 views
5

我有一些LINQ的代碼,有時nulllinq .Value可空對象必須有一個值。如何跳過?

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

TourOpID有時nulla.Value.ToString()拋出一個錯誤。我該如何解決這個問題?

回答

13

的問題時,因爲你訪問一個Nullable類型,是null(或者,更準確地說,它HasValue屬性爲false)的Value property。如何解決這個問題取決於你想要做什麼:

  1. 如果您想篩選出的項目,其中TourOpID爲空,只需添加一個where條款:

    ... 
    (from b in CompleteData 
    where b.TourOpID != null   // filter 
    select b.TourOpID).Distinct() 
    ... 
    
  2. 如果你想使用替代值,例如0,如果TourOpID爲空,則使用null coalescing operator??,其將您int?int

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

    ,或者

    ... 
    select new ComboBoxItemString() { ValueString = a.GetValueOrDefault().ToString() }); 
    
  3. 如果你只是想表現出不同的組合框條目;如果使用三元運算符?:

    ... 
    select new ComboBoxItemString() { 
        ValueString = (a == null ? "no tour operator" : a.Value.ToString()) 
    }); 
    
    如果它不具有值

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

    因爲Nullable.ToString返回一個空字符串:

    如果你想顯示空字符串,如果a爲null,該解決方案更簡單。

+3

最佳回答爲止。 +1。 –

1

使用where

from b in CompleteData where b.TourOpID != null select b.TourOpID 
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 
相關問題