2011-08-01 14 views
2

配列 "arrayID"に値がある場合、次のコードを返します。linqを使用して要素がリストに存在しない場合の値を返す

string str = arrayID.Single(s => s == ((System.Data.DataRowView)(e.Item.DataItem)).Row["ID"].ToString()); 

私が今直面してる問題は値が存在しない場合、私は

シーケンスが一致する要素に

私は空を持っていると思いますが含まれていないエラーが出るということです値がarrayIDに存在しない場合に返される文字列。

これがlinqでどのように行われるかを教えてください。

ありがとうございます。

答えて

6

SingleOrDefaultメソッドは、あなたが後にしているものです。何のアイテムが存在しない場合、それはあなただけの空にそれを変換する別のステップが必要ですので、(ヌル)のデフォルト値を返します。SingleOrDefault

string str = arrayID 
    .SingleOrDefault(s => s == ((System.Data.DataRowView)(e.Item.DataItem)).Row["ID"].ToString()) 
     ?? string.Empty 
+0

良い点 - 文字列が参照型であるため、それはあなたがnull与え、あなたは '??'使用することができますが、それはいくつかの余分な手順になります場合値の型でこれを達成しようとしていました。おそらく、 'Contains'、' Exists'、 'Count'、または' IndexOf'呼び出しが存在するかどうかを調べます。 –

4

デフォルトではC#デフォルトキーワードを指します。したがって、何も見つからない場合、ソース値のデフォルトが返されます。

http://msdn.microsoft.com/en-us/library/xwth0h0d.aspx

だから値型のデフォルトは nullになりませんので注意してください。例えば

 int[] list = { 1, 3, 7, 13,21}; 

     int v; 
     try { 
      v=list.Single(n => n > 15); 
     } 
     catch (Exception ex) { 
      Console.WriteLine(ex.Message); 
     } 

     int? v2; 
     v2 = list.SingleOrDefault(n => n > 30); 
     Console.WriteLine(v2.ToString()); 
     // output: 0 

     int v3; 
     v3=list.SingleOrDefault(n => n > 30);    
     Console.WriteLine(v3.ToString()); 
     // output: 0 

     string[] slist = {"a", "b", "c"}; 
     var v4 = slist.SingleOrDefault(s => s == "z"); 
     Console.WriteLine(v4==null); 
     // output: true  <-- i.e. it is a reference type + it is nullable. 
sgtzの答えで
関連する問題