1

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

X 马哈莱西

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

4

3 回答 3

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

但是,如果这是一段经常运行的代码,我会考虑使用 aStringBuilder代替。

于 2016-07-13T13:36:18.793 回答
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)
    : ""; 

只需提取两种方法,代码就变成了一种更易读,因此更容易调试的方法。不要重复自己

于 2016-07-13T13:54:12.043 回答
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);
    }

它也检查属性是否为空。那么代码会更干净,更易读:

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

ws.Rows[index].Cells[24].Value = value;
于 2016-07-13T14:18:28.800 回答