2012-10-12 2 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 метод. Do arraylist и hashtable не реализуют ICollection , а только ICollection? Цель этих программ - измерять эффективность различных структур данных. Мне следовало бы прочитать, как использовать разные Коллекции и интерфейсы. – ThingWings

+0

@ Kosmo 'ArrayList' и' Hashtable' do реализуют только '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

A Dictionary<TKey,TValue> реализует ICollection<KeyValuePair<TKey,TValue>> не ICollection<TValue>. Кажется, что вы никогда не используете ключ, так почему бы не использовать HashSet<T> вместо этого? HashSet<T> инвентарь ICollection<T>.


UPDATE

Код линии

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

позволяет мне думать, что все, что вам нужно, это упорядоченный список. В отличие от отсортированного списка, который сортирует список в соответствии с ключом, упорядоченный список сохраняет исходный порядок вставки. Таким образом, вы, вероятно, лучше всего используете List<T>.

+0

Согласен, если вы никогда не используете ключ в словаре, почему бы даже не использовать словарь. Если вы хотите, чтобы дубликаты использовали список , если вы не хотите, чтобы дубликаты использовали HashSet

Смежные вопросы