3

我正在尝试创建一个包含泛型类型列表的泛型类,
但我希望有一个除 null 以外的默认值来检查项目是否已被删除
,列表应如下所示

0 TypeV   (some value of TypeV)
1 null
2 null    (never been used)
3 default (deleted)
4 TypeV

有任何想法吗 ?

4

3 回答 3

3

如果TypeV不在您的控制范围内,则它始终可以是值类型,在这种情况下,绝对没有可以用作哨兵的值(对于引用类型,您可以拥有哨兵值并用于object.ReferenceEquals检查插槽是否包含它)。这意味着唯一可能的实现是在列表中的每个槽位使用一个额外的信息位。

一个合理的选择是保留 aList<Tuple<TypeV, bool>>并将其bool用作“已删除”标志。

于 2012-11-14T21:12:53.893 回答
1

对于引用类型,默认值为null(您无法定义该值是从未使用过还是已被删除)。所以你的想法不适用于引用类型的泛型参数。另一方面,非引用类型不能有空值。因此,唯一的选择是对象数组(它可以同时包含空值和值类型):

// TODO: check for index fit array range
public class Foo<T>
   where T : struct
{
   object[] values = new object[5];

   public void Add(T value, int index)
   {
       // TODO: do not allow to add default values to array
       values[index] = value;
   }

   public void Delete(int index)
   {
       values[index] = default(T);
   }
}

Foo<int> foo = new Foo<int>();
foo.Add(1, 0);
foo.Add(2, 3);
foo.Add(3, 4);
foo.Delete(3);

此时values将是:

0 1       (some value of T)
1 null    (never been used)
2 null    (never been used)
3 default (deleted)
4 3

但无论如何,您无法定义是否删除了某些项目,或者它是否添加了默认值。因此,如果您从不向数组添加默认值,您的想法将起作用。

于 2012-11-14T21:18:50.780 回答
-2

那么最好使用字典

List<Tuple<TypeV, bool>>

因为您可以在 O(1) 中获得状态。

或者只使用 HashSet,当你想检查项目是否被删除时,使用 Contains(item)。这也适用于 O(1)。

于 2012-11-14T21:19:48.430 回答