我有一个可以实现各种集合和数据类型的接口,它可以很好地处理一些集合,但是字典给了我一些问题,我猜是因为字典有点不同并且具有键值对?
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;
}
}
答案 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。