Построение строки с использованием троичных операций
Я пытаюсь построить строку с помощью троичных операций и передать ее в ячейку файла 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;