2012-11-14 84 views
3

我'試圖創建一個包含泛型類型
列表的通用類,但我想有null以外的默認值來檢查,如果一個項目被刪除
名單應該看像這樣默認不爲空一般價值

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

有什麼想法嗎?

+1

我無法解析「來檢查一個項目是否被刪除 該列表應該看起來像這樣」 –

+0

mmm我的意思是如果我有一些類型的正常數組(字符串)數組中的所有項目都設置爲null,如果我添加了一個項目,然後再刪除它如何知道那裏有一個項目? – user1748906

回答

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 

但無論如何,你無法定義某個項目是否被刪除,或者它是否添加了默認值。所以,如果你從不將默認值添加到arra年。

+0

但是,如果我們要使用對象,有泛型的點是什麼 – user1748906

+1

@ user1748906同樣的問題我想問你 - 看你的樣本和我的解釋爲什麼只有對象符合你的需求 –

+0

我想你是對的,你的解決方案的工作原理即使有引用類型,如果我有一個靜態只讀字段DEFAULT = new object(); – user1748906

3

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

合理的選擇是保留List<Tuple<TypeV, bool>>並使用bool作爲「已刪除」標誌。

+0

我同意。這是不是爲什麼'可空'被引入? – neontapir

+0

@neontapir:不,不是。如果'TypeV'爲'可爲空'呢? – Jon

+0

@Jon他並不是說你應該使用'Nullable'作爲你的實現,他指的是'Nullable'既包含值又包含一個布爾指示,如果它是「真實」的,並且你使用相同的模型。 – Servy

-2

這是更好地使用字典,然後

List<Tuple<TypeV, bool>> 

,因爲你可以在O獲取狀態(1)。

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

+0

這是如何解決這個問題的? – neontapir

+0

你可以用一個'詞典'來表示一個稀疏填充的列表,雖然這個答案實際上沒有提供或提供足夠的信息來真正成爲「答案」。 – Servy