Are there any collections in .NET that prevent null entries?
我特别考虑的是一个集合可以履行集合的契约,但我认为这个问题可以应用于任何类型的集合。.NET框架中是否存在阻止空项的集合?我想要的具体行为是:
1 2 3 | var set = new HashSet<object>(); bool added = set.Add(null); Console.WriteLine(added); // prints"False" |
这不是内置
编辑:很明显,这只是一种无聊的猜测。主要是因为我想不出任何理由让
除了这个单一的行为之外,没有一个像
如果你需要这个,我建议你自己卷。不过,我不建议将
只需封装一个
如果希望此类是泛型类,则需要添加一个额外的约束,以仅与类一起使用,因为您希望进行空检查:
1 2 3 4 5 | public class ValueSet<T> : ICollection<T>, IEnumerable<T>, ICollection where T : class { private HashSet<T> hashSet = new HashSet<T>(); // ... Implement all members as needed... |
写一个哈希集的扩展方法怎么样?这可能是最简单的事情。
1 2 3 4 5 6 7 8 9 10 11 | public static class HashSetExtensions { public static bool AddNonNull<T>(this HashSet<T> set, T item) where T : class { if (item == null) return false; return set.Add(item); } } |
然后您可以这样做:
1 2 |
当您用
即使您设法阻止添加空条目,也无法阻止在集合中包含空条目——至少不能通过您的
以
当然有点笨拙,但在你想出自己的收藏类型之前,也许这对你来说是一个很好的解决办法。
我不知道有任何.NET集合会这样做,因为根据传递的类型,空实际上是一个有效的条目,因此添加是成功的。
我最有可能从System.Collections.ObjectModel.Collection类开始滚动您自己的类。
正如其他人所回答的,没有不允许空值的集合类。说了这些之后,我将分享一个我在一些情况下使用的简单解决方案。在我的例子中,我正在设计接受哈希集参数的方法,因为我需要确保获得唯一的对象。我不希望在集合中出现可能的空值,也不希望每次枚举项并对其执行操作时都检查空值。我的解决方案是简单地调用remove null,以防出现空值。
1 2 3 4 5 6 7 8 9 10 11 | public void MyMethod(HashSet<SomeType> set) { // remove null item in case it's there set.Remove(null); foreach (var item in set) { // safe to assume item is not null item.DoSomething(); } } |
在任何情况下,您都可以在.NET 4.0中使用代码约定来防止
1 2 3 4 5 6 7 8 9 10 11 | public class MyClass { private List<Something> nonNullList; [ContractInvariantMethod] void NonNullEntries() { Contract.Invariant(Contract.ForAll(nonNullList, el => el != null)); } public void Add(Something el) { Contract.Requires(el != null); } |
}
标记为
两种选择:
编辑:对不起,我错过了,他需要一套,而不是一个收藏。至少我列出的首选项仍然有效。:)
优选:在向集合中添加项的方法中,如果使用无效值调用了
从
你得自己滚。如果您希望add返回一个bool(无论该项是非空的,因此添加的还是相反的),那么您必须从头开始。我可能建议从列表继承并抛出ArgumentNullExceptions。我的意思是,如果您真的不想添加空值,异常可能是最好的方法,而且肯定会更容易。