将Dictionary <mytype> .ValueCollection转换为IList <mytype> </mytype> </mytype>

时间:2010-03-29 19:08:20

标签: c# .net-2.0

我在课堂上使用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;
}

4 个答案:

答案 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%肯定。)