0

我有一个可以实现各种集合和数据类型的接口,它适用于某些集合但字典给我带来了问题,我猜是因为字典有点不同并且有键值对?

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;
    }
}
4

3 回答 3

4

IDictionary<TKey, TValue>不执行ICollection,执行ICollection<KeyValuePair<TKey, TValue>>

照原样,如果您将字典更改为 aIDictionary您的代码将编译。

但是,在我看来,您对界面和对象的整体设计可能会被重新设计。

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;
  }
}
于 2012-10-12T18:50:36.063 回答
2

ADictionary<TKey,TValue>实现ICollection<KeyValuePair<TKey,TValue>>不了ICollection<TValue>。似乎您从未使用过密钥,那么为什么不使用 aHashSet<T>呢?HashSet<T>实现ICollection<T>


更新

你的代码行

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

让我认为您所需要的只是一个有序列表。与根据键对列表进行排序的排序列表相比,有序列表保持原始插入顺序。因此,您可能最好使用List<T>.

于 2012-10-12T18:55:30.523 回答
0

是的,但 Dictionary 有一种方法可以将自身转换为实现 ICollection 的 List:

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

这将返回KeyValuePairs 的集合。

于 2012-10-12T18:47:11.063 回答