簡體   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