将词典作为ICollection返回

时间:2012-10-12 18:38:44

标签: c# generics collections dictionary 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;
    }
}

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

Dictionary<TKey,TValue>实施ICollection<KeyValuePair<TKey,TValue>>而非ICollection<TValue>。您似乎永远不会使用密钥,那么为什么不使用HashSet<T>呢? HashSet<T>实施ICollection<T>


<强>更新

您的代码行

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

让我认为您需要的只是一个有序列表。与按照键排序列表的排序列表相反,有序列表保留原始插入顺序。所以你最好使用List<T>

答案 2 :(得分:0)

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

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

这将返回KeyValuePair s。

的集合