2012-10-12 94 views
0

我有一個接口,可以實現各種集合和數據類型,它與一些集合工作正常,但字典給我的問題,我猜是因爲字典是有點不同,並具有鍵值對?返回字典作爲ICollection

public interface IStructure 
{ 
    void InsertRun<T> (T item); 
    ICollection RetrieveSortedListRun<T>(); 
    T RetrieveItemRun<T>(T item); 
} 

class DictionaryRun : IStructure 
{ 
    IDictionary<int, object> dictionary; 

    public DictionaryRun() 
    { 
     dictionary = new Dictionary<int, object>(); 
    } 

    public void InsertRun<T>(T item) 
    { 
     dictionary.Add(dictionary.Count + 1, item); 
    } 

    public ICollection RetrieveSortedListRun<T>() 
    { 
     return dictionary; 
    } 

    public T RetrieveItemRun<T>(T item) 
    { 
     return item; 
    } 
} 
+1

好吧...那麼你如何使用'ICollection'和你有什麼問題阻止了它目前的工作? – Servy

回答

3

IDictionary<TKey, TValue>不執行ICollection,它執行ICollection<KeyValuePair<TKey, TValue>>

因爲如果您將字典更改爲IDictionary,您的代碼將被編譯。

但是,在我看來,你的接口和對象的整體設計可能會被重寫。

public interface IStructure<T> 
{ 
    void InsertRun(T item); 
    ICollection<T> RetrieveSortedListRun(); 
    T RetrieveItemRun(T item); 
} 


class DictionaryRun<T> : IStructure<T> 
{ 
    IDictionary<int, T> dictionary; 

    public DictionaryRun() 
    { 
    dictionary = new Dictionary<int, T>(); 
    } 

    public void InsertRun(T item) 
    { 
    dictionary.Add(dictionary.Count + 1, item); 
    } 

    public ICollection<T> RetrieveSortedListRun() 
    { 
    return dictionary.Values; 
    } 

    public T RetrieveItemRun(T item) 
    { 
    return item; 
    } 
} 
+0

似乎很好,我遇到問題時實現其他集合,如數組列表和散列表,並試圖返回它們在RetrieveSortedList方法。 ArrayList和hashtable不執行ICollection ,但只是ICollection?這個程序的目的是測量各種數據結構的效率。我應該去閱讀如何一起使用不同的集合和接口。 – ThingWings

+0

@Kosmo'ArrayList'和'Hashtable'只執行'ICollection',有'List '和'HashSet '等類型選項,你可以看看哪些實現'ICollection '。 –

0

是的,但字典有自己轉換到一個列表,它實現ICollection的方法:

public ICollection RetrieveSortedListRun<T>() 
{ 
    return dictionary.ToList(); 
} 

這將返回KeyValuePair個集合。

+0

'Dictionary '沒有定義'ToList()'方法,它被'System.Linq.Enumerable'定義爲擴展方法。文檔:http://msdn.microsoft.com/en-us/library/bb342261.aspx – mlorbetske

3

一個Dictionary<TKey,TValue>工具ICollection<KeyValuePair<TKey,TValue>>ICollection<TValue>。看起來你從來沒有使用鑰匙,那麼爲什麼不使用HashSet<T>呢? HashSet<T> implements ICollection<T>


UPDATE

你的代碼行

dictionary.Add(dictionary.Count + 1, item); 

讓我認爲所有你需要的是一個有序列表。與按列表排序列表的排序列表相比,排序列表保留原始插入順序。所以你可能最好使用List<T>

+0

我同意,如果你從來沒有使用密鑰進入字典,爲什麼甚至使用字典。如果你想允許重複使用列表,如果不想允許重複使用HashSet