Построение строки с использованием троичных операций

Я пытаюсь построить строку с помощью троичных операций и передать ее в ячейку файла Excel. Вот мой код:

            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.IlceAdi а также i.IliskiliSehir.SehirAdi а также i.IliskiliYerGorme.KatNo не являются нулевыми Когда я запускаю код, я получаю только

Х Махаллеси

А именно, я не могу получить другие объекты, независимо от того, являются ли они нулевыми. Где я делаю не так? Является ли идея генерации строки с использованием троичных операций, как это неправильно? Как я могу сделать это правильно? Благодарю.

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 вместо.

Я предлагаю извлекать методы для этого

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

С помощью всего лишь двух извлеченных методов код превращается в один, гораздо более читаемый и, следовательно, более легкий для отладки. Не повторяйся.

Скорее всего, даже компилятор смущен этими длинными "?:". Я бы написал простой метод расширения с выражением.

    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);
    }

Он также проверяет, является ли свойство нулевым. Тогда код будет чище и более читабельным:

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

ws.Rows[index].Cells[24].Value = value;
Другие вопросы по тегам