【问题标题】:Hashset "value cannot be null" error哈希集“值不能为空”错误
【发布时间】:2012-07-22 07:52:39
【问题描述】:

我正在尝试执行以下代码,如果 myObject 为 != null 则它可以正常工作,但如果 myObject 为 null 则抛出“值不能为 null”错误。理想情况下,如果 myObject 为空,那么我希望 HashSet 有一个单一的值 0。

var ids = new HashSet<int>(myObject.Select(p => p.ID));

我尝试了几种不同的方法。我不确定为什么我认为这会起作用。

var ids = new HashSet<int>(myObject.Select(p => p.ID).Where(p => p != null));

这似乎应该可以工作。

var ids = new HashSet<int>(myObject.Select(p => (p == null) ? 0 : p.ID));

终于成功了,但似乎必须有更好的方法。

var ids = new HashSet<int>(myObject!= null ? myObject.Select(p => p.ID) : new int[] {0});

有人有更好的方法吗?

【问题讨论】:

    标签: c# hash hashmap hashtable


    【解决方案1】:

    现在,您的答案可以稍微整理一下:

    var ids = new HashSet<int>(myObject?.Select(p => p.ID) ?? new [] {0});
    

    【讨论】:

      【解决方案2】:

      如果 myObject 为空,您的代码将转换为

      var ids = new HashSet<int>(null.Select(p => p.ID));
      

      您不能使用 Select 扩展方法关闭 null。

      你的选择

      var ids = new HashSet<int>(myObject!= null ? myObject.Select(p => p.ID) : new int[] {0});
      

      是我所知道的最紧凑的形式,可以满足您的要求,但如果您愿意,当然可以将这种复杂性隐藏在方法或扩展方法中。

      【讨论】:

      • 你认为我为了紧凑而牺牲了可读性吗?我看着它,它是有道理的,但是其他人会看到那行代码并发现它过于复杂吗?
      猜你喜欢
      • 2015-01-02
      • 2013-03-30
      • 1970-01-01
      • 2015-11-07
      • 2013-10-09
      • 2014-01-30
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多