使用三元运算生成字符串

本文关键字:运算 字符串 三元 | 更新日期: 2023-09-27 17:56:57

我正在尝试使用三元运算构建一个字符串并将其传递给 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.IlceAdii.IliskiliSehir.SehirAdii.IliskiliYerGorme.KatNo不是空的。当我运行代码时,我只得到

X 马哈雷西

也就是说,我无法获取其他实体,无论它们是否为空。我哪里做错了?使用这样的三元运算生成字符串的想法是错误的吗?我怎样才能以正确的方式做到这一点?谢谢。

使用三元运算生成字符串

这几乎可以肯定取决于运算符优先级; + 的优先级高于 ?: ,也就是说,如果我们只取前几行:

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

它检查属性是否也为 null。然后代码将更清晰,更具可读性:

var value = i.IliskiliCokluIsler.Count == 0 
    ? string.Empty
    : i.IliskiliMahalle.GetName(m => m.MahalleAdi, " Mahallesi") 
        + ....
        + ....;
ws.Rows[index].Cells[24].Value = value;