我在课堂上使用Dictionary<int, MyType>
。该类实现了一个需要返回IList<MyType>
的接口。是否有一种简单的方法可以将一个转换为另一个(不复制整个事物)?
我目前的解决方案如下:
private IList<MyType> ConvertToList(Dictionary<int, MyType>.ValueCollection valueCollection)
{
List<MyType> list = new List<MyType>();
list.AddRange(valueCollection);
return list;
}
答案 0 :(得分:26)
你需要复制一份,但这可能是一件好事。在C#2中,您当前的代码几乎是最干净的代码。通过直接根据您的值(List<MyType> list = new List<MyType>(valueCollection);
)构建列表可以改进它,但仍然需要副本。
然而,使用LINQ和C#3,您将能够:
myDictionary.Values.ToList();
话虽如此,我不会(可能)试图避免副本。返回值的副本往往更安全,因为它会阻止调用者在尝试修改集合时导致问题。通过返回副本,调用者可以执行list.Add(...)
或list.Remove(...)
而不会导致您的课程问题。
编辑:根据下面的评论,如果你想要的只是IEnumerable<T>
有一个点数,你就可以返回ICollection<T>
。这个 直接由ValueCollection
实现,这意味着您可以直接返回字典的值,而无需复制:
private ICollection<MyType> ConvertToList(Dictionary<int, MyType>.ValueCollection valueCollection)
{
return valueCollection;
}
(当然,这种方法在这种情况下变得毫无用处 - 但我想为你演示......)
答案 1 :(得分:3)
怎么样
Dictionary<int, MyType> dlist = new Dictionary<int, MyType>();
IList<MyType> list = new List<MyType>(dlist.Values);
答案 2 :(得分:2)
这是不可能的。
字典(包括其Values
集合)是一种固有的无序集合;它的顺序将根据其键的哈希码而改变。这就是ValueCollection
首先没有实现IList<T>
的原因。
如果真的想要,您可以使用索引器中的IList
循环创建一个实现ValueCollection
并包装foreach
的包装器类。但是,这不是一个好主意。
答案 3 :(得分:0)
您可以使用构造函数:
public IList<MyType> MyValues
{
get { return new List<MyType>(myDictionary.Values); }
}
(编辑删除断言我不是100%肯定。)