2012-07-24 28 views
1

我试图执行下面的代码,它工作正常,如果myObject是!= null,但如果myObject为null则抛出“值不能为空”错误。理想情况下,如果myObject的为null,则我想只是有HashSet的有0Hashset“值不能为空”错误

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

任何人都有更好的方法来做到这一点?

回答

0

如果myObject的是零,你的代码转换为

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

不能使用选择扩展方法断空的。

你的替代

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

是最紧凑的形式,我所知道的,以满足您的要求,但肯定你可以隐藏在方法的复杂性或扩展方法,如果你喜欢。

+0

你以为我牺牲可读性紧凑?我看着它,这是有道理的,但其他人会看到这行代码,并发现它太过复杂? – Jay 2012-07-24 13:31:43

0

现在,你的回答可以清理只是有点:

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