Sea*_*lin 15 .net c# generics collections
我正在考虑一个符合一套合同的集合,但我认为这个问题适用于任何类型..NET框架中是否存在阻止空条目的集合?我想要的具体行为是这样的:
var set = new HashSet<object>();
bool added = set.Add(null);
Console.WriteLine(added); // prints "False"
Run Code Online (Sandbox Code Playgroud)
这不是内置的行为HashSet<T>.是否存在任何具有此(或类似)行为的集合,或者我最好自己滚动?如果是后者,最好的方法是什么?我应该直接继承HashSet<T>还是仅包装?
编辑:要清楚,这只是空闲的想知道.主要是因为我想不出任何理由,我会永远想允许null进入一组对象.我对此没有任何特别需要.
Ree*_*sey 12
HashSet<T>除了这个单一行为之外,没有内置类.
如果你需要这个,我建议你自己动手.但是,我不推荐使用子类化HashSet<T>.没有一种方法(比如Add,你明确想要改变的)是虚拟的,因为它并没有真正考虑到子类化.这将导致奇怪的使用行为,因为您将隐藏继承的方法.
只需封装一个HashSet<T>,然后公开您需要的成员.您必须添加的唯一真正的"代码"是对Add方法的单个空检查 - 否则,只需将所有方法传递给封装的实例.
如果您希望这是一个泛型类,则需要添加一个额外的约束才能使用类,因为您希望进行空检查:
public class ValueSet<T> : ICollection<T>, IEnumerable<T>, ICollection
where T : class
{
private HashSet<T> hashSet = new HashSet<T>();
// ... Implement all members as needed...
Run Code Online (Sandbox Code Playgroud)
怎么样为HashSet编写扩展方法.这可能是最简单的事情.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做:
HashSet<object> test = new HashSet<object>();
test.AddNonNull(null); //Will return false;
Run Code Online (Sandbox Code Playgroud)