2012-08-08 10 views
5

Aufgrund des vorhandenen Framework, das ich verwende, gibt ein Methodenaufruf ein SortedList-Objekt zurück. Da ich die andere Seite dieses Anrufs geschrieben habe, weiß ich, dass es sich tatsächlich um eine SortedList handelt. Während ich weiterhin mit der SortedList arbeiten kann, würde die Verwendung des Generic meine Bedeutung besser vermitteln. Also, wie ändert man die nicht-generische SortedList in eine entsprechend typisierte generische SortedList?Wie konvertiert man eine SortedList in eine SortedList <>

Der Hintergrund ist, dass der Aufruf ein remote Prozeduraufruf ist, der den SoapFormatter verwendet. Der SoapFormatter implementiert keine Generika (Danke, Microsoft). Ich kann den Formatierer nicht ändern, da einige Nicht-.Net-Programme auch andere Methodenaufrufe für den Dienst verwenden.

würde ich meine Proxy-Aufruf mag wie die aussehen folgende:

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

Wo die Schnittstelle für die GetList Aufruf ist als aufgrund der Anforderungen SoapFormatter folgt:

public SortedList GetList(string parameter); 

Antwort

4

eine Konvertierungsfunktion für die Nutzung:

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

Der äquivalente foreach(DictionaryEntry entry in list) Ansatz ist etwas langsamer aufgrund der impliziten Umwandlung des DictionaryEntry (Sie immer die Abgüsse müssen TKey/TValue) unbox.

Ballpark Leistung Overhead: Auf meiner alten Maschine hier dauert diese Funktion 100ms, um eine 1000 Listen mit je 1000 Einträgen zu konvertieren.

+0

Vielen Dank, sowohl für das explizite Beispiel, und die Informationen zur Leistung. Es war sehr hilfreich. – user1542042

+0

Sie könnten jedoch bemerken, dass Sie GetKey() zweimal in Zeile 4 Ihres Beispiels verwendet haben. Ich glaube, dass die zweite Instanz GetByIndex() sein sollte. – user1542042

+0

Danke; es ist repariert! –

6

Sie können nicht direkt konvertieren, wie ein SortedList ist eigentlich kein SortedList<T>, auch wenn es nur Elemente des Typs T enthält.

Um dies zu Ihrem passenden Typ zu machen, müssen Sie eine SortedList<T> erstellen und alle Elemente hinzufügen.

Verwandte Themen