2012-08-08 14 views
5

Ze względu na istniejący framework, którego używam, wywołanie metody zwraca obiekt SortedList. Ponieważ napisałem drugą stronę tego połączenia wiem, że jest to w rzeczywistości SortedList. Podczas gdy mogę kontynuować pracę z SortedList, użycie generycznego lepiej oddałoby moje znaczenie. Jak więc zmienić nieporządny SortedList w odpowiednio wpisany rodzajowy SortedList?Jak przekonwertować SortedList na SortedList <>

Wyjaśnia to, że wywołanie to zdalne wywołanie procedury za pomocą SoapFormatter. SoapFormatter nie implementuje generycznych (dziękuję, Microsoft). Nie mogę zmienić formatera, ponieważ niektóre programy inne niż .Net również używają innych wywołań metod względem usługi.

Chciałbym moje wezwanie proxy, aby wyglądać następująco:

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

Gdzie interfejs dla połączenia GetList jest następująca ze względu na wymogi SoapFormatter:

public SortedList GetList(string parameter); 

Odpowiedz

4

Funkcja konwersji do użycia:

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

Równowartość foreach(DictionaryEntry entry in list) podejście jest nieco wolniej ze względu na niejawny oddanych do unbox DictionaryEntry (zawsze trzeba odlewy do TKey/TValue).

Napowietrzny wzrost wydajności: tutaj na mojej starej maszynie ta funkcja zajmuje 100 ms, aby przekonwertować 1000 list z 1000 wejściami.

+0

Dziękuję bardzo, zarówno za wyraźny przykład, jak i za informacje o skuteczności. To było bardzo pomocne. – user1542042

+0

Możesz zauważyć, że dwukrotnie użyłeś GetKey() w linii 4 swojego przykładu. Uważam, że drugą instancją powinna być GetByIndex(). – user1542042

+0

Dzięki; jest naprawione! –

6

Nie możesz bezpośrednio przekonwertować, jako SortedList w rzeczywistości nie jest to SortedList<T>, nawet jeśli zawiera tylko elementy typu T.

Aby zmienić ten typ na odpowiedni, należy utworzyć SortedList<T> i dodać do niego wszystkie elementy.

Powiązane problemy