2016-07-13 11 views
1

3進演算を使用して文字列を作成し、それをExcelファイルのセルに渡そうとしています。ここに私のコードは次のとおりです。3進演算を使用した文字列の作成

  ws.Rows[index].Cells[24].Value = i.IliskiliCokluIsler.Count == 0 ? 

       i.IliskiliMahalle.MahalleAdi != null ? i.IliskiliMahalle.MahalleAdi + " Mahallesi" : "" + 
       i.IliskiliYerGorme.BulvarCadde != null ? i.IliskiliYerGorme.BulvarCadde + " Cadde" : "" + 
       i.IliskiliYerGorme.Sokak != null ? i.IliskiliYerGorme.Sokak + " Sokak" : "" + 
       i.IliskiliYerGorme.BinaNo != null ? "Bina no : " + i.IliskiliYerGorme.BinaNo : "" + 
       i.IliskiliYerGorme.KatNo != null ? i.IliskiliYerGorme.KatNo + " Kat" : "" + 
       i.IliskiliIlce.IlceAdi + i.IliskiliSehir.SehirAdi : ""; 

私はi.IliskiliIlce.IlceAdii.IliskiliSehir.SehirAdii.IliskiliYerGorme.KatNoがnullでないことを知っています。私は、コードを実行すると、私は唯一の

X MAHALLESI

を取得する。すなわち、私は、彼らがnullであるか否かの他のエンティティを取得することはできません。どこが間違っていますか?そのような三項演算を使って文字列を生成するという考えは間違っていますか?どうすれば正しい方法でそれを行うことができますか?ありがとう。

答えて

3

これは、オペレータの優先順位にほぼ確実に影響します。あなたが望むものではありません

i.IliskiliMahalle.MahalleAdi != null ? i.IliskiliMahalle.MahalleAdi + " Mahallesi" : 
    ("" + i.IliskiliYerGorme.BulvarCadde != null ? 
     i.IliskiliYerGorme.BulvarCadde + " Cadde" : "") 

:それは、それらを評価します

i.IliskiliMahalle.MahalleAdi != null ? i.IliskiliMahalle.MahalleAdi + " Mahallesi" : "" + 
i.IliskiliYerGorme.BulvarCadde != null ? i.IliskiliYerGorme.BulvarCadde + " Cadde" : "" 

:私たちはラインのちょうど最初のカップルを取る場合+は、つまり、?:よりも優先順位が高いです。あなたは括弧を使用してラインのそれぞれを囲むことにより、この問題を解決することができます

ws.Rows[index].Cells[24].Value = i.IliskiliCokluIsler.Count == 0 ? 
(i.IliskiliMahalle.MahalleAdi != null ? i.IliskiliMahalle.MahalleAdi + " Mahallesi" : "") + 
(i.IliskiliYerGorme.BulvarCadde != null ? i.IliskiliYerGorme.BulvarCadde + " Cadde" : "") + 
(i.IliskiliYerGorme.Sokak != null ? i.IliskiliYerGorme.Sokak + " Sokak" : "") + 
(i.IliskiliYerGorme.BinaNo != null ? "Bina no : " + i.IliskiliYerGorme.BinaNo : "") + 
(i.IliskiliYerGorme.KatNo != null ? i.IliskiliYerGorme.KatNo + " Kat" : "") + 
(i.IliskiliIlce.IlceAdi + i.IliskiliSehir.SehirAdi : ""); 

これは、コードの多くの場合、実行ビットの場合は、しかし、私が代わりにStringBuilderを使用して検討します。

+1

私はStringBuilderをここに役立つだろうかわからない - 現在の形での(単一のステートメントでの文字列連結)このコードは、単一のString.Concat呼び出しとして変換されます。 –

+0

@HansKesting編集してくれてありがとうと、「String.Concat」のメモに感謝しました。私はそれを知りませんでした。 –

1

私はちょうど2つの方法がコードを抽出して、この

private static string NvlSuffix(string value, string suffix) { 
    return (null == value) ? "" : value + " " + suffix; 
    } 

    private static string NvlPrefix(string value, string prefix) { 
    return (null == value) ? "" : prefix + " " + value; 
    } 

... 

    ws.Rows[index].Cells[24].Value = i.IliskiliCokluIsler.Count == 0 
    ? string.Concat(
     NvlSuffix(i.IliskiliMahalle.MahalleAdi, "Mahallesi"), 
     NvlSuffix(i.IliskiliYerGorme.Sokak, "Sokak"), 
     NvlPrefix(i.IliskiliYerGorme.BinaNo, "Bina no"), 
     NvlSuffix(i.IliskiliYerGorme.KatNo, "Kat"), 
     i.IliskiliIlce.IlceAdi, 
     i.IliskiliSehir.SehirAdi) 
    : ""; 

ため抽出する方法を提案は1はるか読みやすいので、のデバッグが容易になります。 は自分自身を繰り返さないでください

0

コンパイラでさえ、それらの長い「?:」によって混乱する可能性があります。私は式で簡単な拡張メソッドを記述します。

public static string GeName<T>(this T source, Expression<Func<T, string>> selector, string addOn) where T : class 
    { 
     if (source == null) return string.Empty; 

     var func = selector.Compile(); 
     var value = func(source); 

     return value == null ? string.Empty : string.Format("{0} {1}", value, addOn); 
    } 

プロパティがnullであるかどうかをチェックします。そして、コードがきれいで読みやすくなります。

var value = i.IliskiliCokluIsler.Count == 0 
    ? string.Empty 
    : i.IliskiliMahalle.GetName(m => m.MahalleAdi, " Mahallesi") 
     + .... 
     + ....; 

ws.Rows[index].Cells[24].Value = value; 
関連する問題