2014-01-07 6 views
6

Ich habe ein Wörterbuch von Objekten wie folgt definiert -Casting Ergebnis Wörterbuch von Objekten nach Überspringen und Nehmen

Dictionary<string, MyObject> myObjectDictionary 

Ich mag würde Artikel im Dictionary eines Index und Anzahl der Elemente basierte greifen. Ich versuche Skip und Take zu verwenden. Dies erfordert jedoch eine Neufassung von Dictionary<string, MyObject>. Wie kann das gemacht werden? Gibt es eine andere Art, wie ich das machen sollte?

Hier ist mein Code und gescheiterten Versuch, neu zu fassen -

Dictionary<string, MyObject> myObjectDictionary = FillMyObjectDictionary(); 

var mySmallerObjectDictionary = myObjectDictionary.Skip(startNumber).Take(count); 

//THE FOLLOWING DOES NOT WORK 
Dictionary<string, MyObject> myNewObjectDictionary = (Dictionary<string, MyObject>)mySmallerObjectDictionary 
+5

Sie wissen, dass der Inhalt von 'mySmallerObjectDictionary' unbestimmt sein wird? Indizes und Wörterbücher mischen sich nicht, da die Aufzählungsreihenfolge eines Dictionarys (oder einer beliebigen Hashtabellenstruktur) nicht definiert ist. Verlassen Sie sich nicht darauf, dass der Anzeigenauftrag der Aufzählungsreihenfolge entspricht. Wenn die Dinge wie erwartet funktionieren, ist das nur ein Zufall. – spender

Antwort

15

Nun können Sie ein neues Wörterbuch erstellen:

Dictionary<string, MyObject> myNewObjectDictionary = 
    myObjectDictionary.Skip(startNumber) 
         .Take(count) 
         .ToDictionary(pair => pair.Key, pair => pair.Value); 

jedoch:

  • Sie sollten sich nicht auf die Bestellung eines Wörterbuchs verlassen. Es ist nicht klar, welche Elemente Sie überspringen möchten. Erwägen Sie die Verwendung von OrderBy vor Skip. Zum Beispiel:

    Dictionary<string, MyObject> myNewObjectDictionary = 
        myObjectDictionary.OrderBy(pair => pair.Key) 
             .Skip(startNumber) 
             .Take(count) 
             .ToDictionary(pair => pair.Key, pair => pair.Value); 
    
  • Dies gilt nicht jeden kundenspezifische Gleichheitsvergleich erhalten, die im ursprünglichen Wörterbuch war. Leider ist das nirgends sichtbar. Sie müssen also nur wissen, ob FillMyObjectDictionary einen benutzerdefinierten Vergleich verwendet.

+1

+10 für "Dies speichert keinen benutzerdefinierten Gleichheitsvergleich, der im ursprünglichen Wörterbuch enthalten war" –

2

Das Ergebnis der Skip/Take Betrieb wird kein IDictionary<string, MyObject> sein, wird es eine IEnumerable<KeyValuePair<string, MyObject>> sein.

Wenn Sie diese zurück in ein Wörterbuch konvertieren wollen, versuchen ToDictionary Aufruf:

var myNewObjectDictionary = mySmallerObjectDictionary.ToDictionary(p => p.Key, p => p.Value); 
Verwandte Themen