[英]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.