3 Stimmen

Wie kann ich alle in einem Dictonary<?,?> enthaltenen KeyValuePairs abrufen?

Ich habe ein Objekt, das ein Dictionary eines unbekannten Typs ist (d.h. ich kenne den Typ des Schlüssels und des Wertes nicht)

Ich möchte alle Werte abrufen, damit ich über den Index auf sie zugreifen kann.

Was ich also tun möchte, ist so etwas wie das:

Dictionary<object, object> d = (Dictionary<object, object>)obj; // cast error
l = new List<KeyValuePair<object,object>>();
foreach (KeyValuePair<object, object> k in d)
   l.Add(new KeyValuePair<object,object>(k.Key, k.Value));

Wie erwartet, lässt mich die Laufzeitumgebung jedoch nicht in ein Dictionary< object, object> umwandeln.

Gibt es eine Möglichkeit, dies in .net 3.0 zu tun (zum Beispiel mit Reflexion?)

15voto

Marc Gravell Punkte 970173

Desde Dictionary<,> implementiert IDictionary (nicht-generisch), wiederholen Sie das einfach:

    IDictionary data = ...
    foreach (DictionaryEntry de in data)
    {
        Console.WriteLine(de.Key + ": " + de.Value);
    }

5voto

Robert Rossney Punkte 91100

Sie können nicht zaubern obj zu einer Dictionary<object, object> denn es ist kein Dictionary<object, object> . Ja, seine Schlüssel und Werte leiten sich ab von object und kann somit auf object . Aber man kann keine generischen Typen in C# casten, weil sie nicht kovariant sind. Auch wenn T leitet sich ab von object , List<T> leitet sich nicht ab von List<object> .

Betrachten Sie diese Methode:

void ModifyList<List<object> list)
{
   for (int i=0; i<list.Count; i++)
   {
      list[i] = list[i].ToString();
   }
}

Wenn Sie eine Rolle spielen könnten List<int> a List<object> könnten Sie eine List<int> zu dieser Methode und sie würde sich in etwas anderes verwandeln.

Dies wird sich ändern, wenn in C# 4.0 kovariante Generika eingeführt werden. Dieser Artikel ist eine ziemlich gute Erklärung für die damit verbundenen Probleme.

Aber um Ihr eigentliches Problem zu lösen, wird dies ausreichen:

List<KeyValuePair<object, object>> list = d.AsEnumerable()
   .Select(x => new KeyValuePair<object, object>(x.Key, x.Value))
   .ToList();

0voto

Ed James Punkte 10129

Vielleicht:

foreach (object key in d.keys)
{
 l.Add(new KeyValuePair(key, d[key]);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X