簡體   English   中英

默認不是null通用值

[英]default not null generic value

我正在嘗試創建一個包含泛型類型列表的泛型類
但我希望有一個非null的默認值來檢查項目是否被刪除
列表應該如下所示

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

有任何想法嗎 ?

如果TypeV不在你的控制之下,那么它總是一個值類型,在這種情況下絕對沒有可以用作標記的值(對於引用類型,你可以有一個sentinel值並使用object.ReferenceEquals來檢查是否一個插槽包含它)。 這意味着唯一可能的實現是在列表中每個插槽使用一個額外的信息位。

一個合理的選擇是保持List<Tuple<TypeV, bool>>並將bool用作“已刪除”標志。

對於引用類型,默認值將為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

但無論如何你無法定義某個項目是否被刪除,或者它是否添加了默認值..所以,如果你從未向數組添加默認值,你的想法將起作用。

那么最好使用字典

List<Tuple<TypeV, bool>>

因為你可以在O(1)中獲得狀態。

或者只是使用HashSet,當你想檢查項目是否被刪除時,使用Contains(item)。 這也適用於O(1)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM