【问题标题】:Is there a cleaner way to set this anonymous class property?有没有更简洁的方法来设置这个匿名类属性?
【发布时间】:2010-11-09 12:32:48
【问题描述】:

我正在返回一个匿名类:

var clients = from c in this.ClientRepository.SearchClientByTerm(term, 10)
    select new
    {
       id = c.Id,
       line1 = c.Address.Line1 ?? "Unknown Information ..."
    };

问题是地址可以为空,这意味着如果它为空,它会爆炸成一百万个。

我能想到的最优雅的解决方案是这个......

    line1 = c.Address != null && c.Address.Line1 != null 
               ? c.Address.Line1 : "Unknown Information ..."

有更好的方法吗?我不喜欢失去使用空合并运算符然后不得不检查是否为空的能力。

【问题讨论】:

  • 我使用的是 poco,所以如果为空,我将地址设置在那里。谢谢。

标签: c# null-coalescing-operator


【解决方案1】:

我能想到的唯一更简洁的方法是将Address 属性的getter 修改为从不返回null,或者让构造函数始终初始化Address。否则你总是需要检查 null。

【讨论】:

    【解决方案2】:

    我只能想到这个:

    line1 = c.Address.HasValue ?  c.Address.Line1.HasValue ? c.Address.Line1 : "Line1 unknown." : "Address unknown."
    

    您还可以修改您的 Address 属性 get{} 方法来检查内容并返回适当的值,最好缓存结果,这样它就不会一遍又一遍地运行相同的检查。

    【讨论】:

    • @SaeedAlg:我看不出这比 OP 代码更丑陋(并不是说我认为其中任何一个都丑陋)。我将 !=null 替换为 HasValue,否则几乎相同。是的,它也是有效的。我还建议了替代解决方案。你为解决这个问题做了什么?哦,是的,你已经对此感到厌烦了。这真的很重要。
    • @danijels,@Skurmedel,@Kohan,太多的事情是有效的,但它们不是好的做法,我拒绝 danijels 到 OP 不要做同样的事情(就像现在做的那样) @Darin Dimitrov,说是一种更好,更清晰的方式,你要继续你的方式来做spaghetti codding,danijels 你在你的短语末尾写了一个更好的方式,这是真的,但我的反对意见是告诉第一个段落是错误的方式。还有 danijels 你有 20+ 和 2- 这是一笔不错的交易:D
    • @SaeedAlg:我并不真正关心我得到或没有得到的分数,但我确实认为你的反对意见既不合理又偏离目标。如果您认为代码很丑陋,那么您应该反对的是 OP,而不是我。但是对于如此离题的IMO,真的没有理由投反对票。有很多帖子讨论意大利面条代码、最佳实践等。这不是其中之一。
    【解决方案3】:

    我会让ClientRepository.SearchClientByTerm() 返回一个初始化的Address 并(可能)在那里设置Line1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-28
      • 1970-01-01
      相关资源
      最近更新 更多