2016-07-13 3 views
1

삼항 연산을 사용하여 문자열을 작성하고 Excel 파일의 셀로 전달하려고합니다. 내가 i.IliskiliIlce.IlceAdii.IliskiliSehir.SehirAdii.IliskiliYerGorme.KatNo가 null이 아닌 것을 알고삼항 연산을 사용하여 문자열 만들기

  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 : ""; 

: 여기 내 코드입니다. 나는이 코드를 실행하면 난 단지

X Mahallesi

는 즉 나는 그들이 널 수 있는지 여부를 다른 개체를 얻을 수 없다 얻을. 내가 어디에서 잘못하고 있니? 그런 삼중 연산을 사용하여 문자열을 생성하는 아이디어가 잘못 되었습니까? 올바른 방법으로 어떻게 할 수 있습니까? 감사.

답변

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

난 코드를 디버깅 한 훨씬 판독 따라서 쉽게 변신 추출 된 두 가지 방법이

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) 
    : ""; 

위한 추출 방법을 제안한다. 자신을 반복하지 마십시오.

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; 
관련 문제