2012-08-08 58 views
5

由於我正在使用現有的框架,方法調用正在返回SortedList對象。因爲我寫了這個調用的另一面,我知道它實際上是一個SortedList。雖然我可以繼續使用SortedList,但使用泛型會更好地表達我的意思。那麼,如何將非泛型SortedList更改爲適當類型的泛型SortedList?如何將SortedList轉換爲SortedList <>

在此的背景是該調用是使用SoapFormatter的遠程過程調用。 SoapFormatter沒有實現泛型(謝謝,微軟)。我無法更改格式化程序,因爲一些非.Net程序也使用其他方法調用該服務。

我想我的代理調用如下所示:

public SortedList<string, long> GetList(string parameter) 
{ 
    return _service.GetList(parameter); 
} 

凡的電話的GetList的界面如下由於SoapFormatter要求:

public SortedList GetList(string parameter); 

回答

4

爲您的使用轉換函數:

static SortedList<TKey,TValue> StronglyType<TKey,TValue>(SortedList list) { 
    var retval = new SortedList<TKey,TValue>(list.Count); 
    for(int i=0; i<list.Count; i++) 
     retval.Add((TKey)list.GetKey(i), (TValue)list.GetByIndex(i)); 
    return retval; 
} 

等效foreach(DictionaryEntry entry in list)方法是稍微慢一些,由於隱式轉換爲拆箱DictionaryEntry(你總是需要強制類型TKEY的/ TValue)。

球場性能開銷:在我這幾年的舊機器上,這個函數需要100ms來將1000個列表轉換爲1000個條目。

+0

非常感謝你,無論是明確的例子,還是關於表現的信息。這非常有幫助。 – user1542042 2012-08-08 22:33:51

+0

但是,您可能會注意到,您在示例的第4行中使用了GetKey()兩次。我相信第二個實例應該是GetByIndex()。 – user1542042 2012-08-08 22:42:15

+0

謝謝;它是固定的! – 2012-08-08 22:45:06

6

你不能直接轉換,因爲SortedList實際上並不是SortedList<T>,即使它只包含T類型的元素。

爲了將其轉換爲適當的類型,您需要創建一個SortedList<T>並將所有元素添加到其中。

相關問題