繁体   English   中英

转换字典 <MyType> .ValueCollection到IList <MyType>

[英]Convert Dictionary<MyType>.ValueCollection to IList<MyType>

我在一个类中使用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;
}

你需要复制一份,但这可能是一件好事。 在C#2中,您当前的代码几乎是最干净的代码。 通过直接构建您的值List<MyType> list = new List<MyType>(valueCollection);List<MyType> list = new List<MyType>(valueCollection); )可以改进它,但仍然需要一个副本。

但是,使用LINQ和C#3,您将能够:

myDictionary.Values.ToList();

话虽这么说,我不会(可能)试图避免副本。 返回值的副本往往更安全,因为它会阻止调用者在尝试修改集合时导致问题。 通过返回副本,调用者可以执行list.Add(...)list.Remove(...)而不会导致类问题。


编辑:鉴于下面的评论,如果您想要的是一个带有Count的IEnumerable<T> ,您只需返回ICollection<T> ValueCollection直接实现的,这意味着您可以直接返回字典的值,而无需复制:

private ICollection<MyType> ConvertToList(Dictionary<int, MyType>.ValueCollection valueCollection)
{
    return valueCollection;
}

(当然,在这种情况下,这种方法变得毫无用处 - 但我想为你演示......)

怎么样

Dictionary<int, MyType> dlist = new Dictionary<int, MyType>();
IList<MyType> list = new List<MyType>(dlist.Values);

这是不可能的。

字典(包括其Values集合)是一种固有的无序集合; 它的顺序将根据其键的哈希码而改变。 这就是ValueCollection不实现IList<T>的原因。

如果你真的想,你可以使用索引器中的foreach循环创建一个实现IList并包装ValueCollection的包装类。 但是,这不是一个好主意。

您可以使用构造函数:

public IList<MyType> MyValues
{
    get { return new List<MyType>(myDictionary.Values); }
}

(编辑删除断言我不是100%肯定。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM