我正在尝试使用三元操作构建一个字符串,并将其传递给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
不为空。当我运行代码时,我只得到
X Mahallesi
即我无法获得其他实体,无论它们是否为空。我哪里做错了?使用这样的三元运算生成字符串的想法是错误的吗?我怎么能以正确的方式做到这一点?感谢。
答案 0 :(得分: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 :(得分: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)
: "";
只提取了两个方法,代码变成一个更容易可读,因此更容易调试。 不要重复。
答案 2 :(得分:0)
甚至连编译器都被那些长期的混淆了#34; :&#34 ;.我会用表达式编写一个简单的扩展方法。
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;