2012-08-08 13 views
5

Debido a la estructura existente que estoy usando, una llamada a método devuelve un objeto SortedList. Como escribí el otro lado de esta llamada, sé que en realidad es una lista ordenada. Si bien puedo seguir trabajando con SortedList, usar el genérico me transmitiría mejor mi significado. Entonces, ¿cómo se cambia la SortedList no genérica en una SortedList genérica apropiadamente tipada?Cómo convertir una SortedList en una SortedList <>

El trasfondo de esto es que la llamada es una llamada a procedimiento remoto usando SoapFormatter. SoapFormatter no implementa genéricos (gracias, Microsoft). No puedo cambiar el formateador ya que algunos programas que no son de red también usan otras llamadas al servicio.

Me gustaría que mi llamada de proximidad para parecerse a lo siguiente:

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

Cuando la interfaz para la llamada GetList es el siguiente, debido a los requisitos SoapFormatter:

public SortedList GetList(string parameter); 

Respuesta

4

una función de conversión para su uso:

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; 
} 

El foreach(DictionaryEntry entry in list) enfoque equivalente es ligeramente más lento debido a la conversión implícita a desempacar el DictionaryEntry (siempre se necesita a los elencos TKey/TValue).

Sobrecarga del rendimiento de Ballpark: en mi vieja máquina de aquí, esta función requiere 100ms para convertir 1000 listas con 1000 entradas cada una.

+0

Muchas gracias, tanto por el ejemplo explícito, como por la información sobre el rendimiento. Fue muy útil. – user1542042

+0

Sin embargo, podría notar que utilizó GetKey() dos veces en la línea 4 de su ejemplo. Creo que la segunda instancia debería ser GetByIndex(). – user1542042

+0

Gracias; ¡está arreglado! –

6

No se puede convertir directamente, como SortedList no es en realidad un SortedList<T>, incluso si solo contiene elementos del tipo T.

Para convertir esto en su tipo apropiado, necesitará crear un SortedList<T> y agregar todos los elementos en él.

Cuestiones relacionadas