7 Stimmen

Gibt es eine einfachere Möglichkeit, eine Liste<KeyValuePair<T, U>> zu initialisieren, wie ein Dictionary<T, U>?

Eigentlich brauche ich etwas wie List<KeyValuePair<T, U>> aber ich möchte in der Lage sein, es wie ein Wörterbuch zu initialisieren (d.h. ohne das Schreiben von new KeyValuePair jedes Mal). Zum Beispiel so:

Dictionary<string, string> dic = new Dictionary<string, string>
{
    { "key1", "value1"}, 
    { "key2", "value2"}
};

9voto

Jon Skeet Punkte 1325502

EDIT: Es stellt sich heraus, dass .NET fait haben bereits eine Kombination aus Liste und Wörterbuch: OrderedDictionary . Leider handelt es sich um einen nicht-generischen Typ, was ihn meiner Meinung nach etwas weniger attraktiv macht. Allerdings wird die Einfügereihenfolge beibehalten, wenn Sie einfach Add wiederholt.

Es ist ein wenig seltsam, wenn man anruft Add fait pas auf Einträge auswirken, für die bereits ein Schlüssel existiert, während die Verwendung des Indexers zum Hinzufügen eines Schlüssel/Wert-Paares eine frühere Zuordnung überschreibt. Im Grunde scheint es keine besonders schöne API zu sein, und ich persönlich würde es immer noch vermeiden, es sei denn, Ihr Anwendungsfall genau seinem Verhalten entspricht.


Nein, .NET hat keine einfügungsreihenfolge-erhaltenden Wörterbücher. Sie könnten immer Ihren eigenen listenbasierten Typ mit dem entsprechenden Add Methode. Dies könnte sogar eine der wenigen Stellen sein, an denen ich eine Erweiterung eines bestehenden Typs in Betracht ziehen würde:

public class KeyValueList<TKey, TValue> : List<KeyValuePair<TKey, TValue>>
{
    public void Add(TKey key, TValue value)
    {
        Add(new KeyValuePair<TKey, TValue>(key, value));
    }
}

Dann:

var list = new KeyValueList<string, string>
{
    { "key1", "value1"}, 
    { "key2", "value2"}
};

Eine Alternative ist die Verwendung der Komposition, aber meine Bauchgefühl ist, dass dies eine sinnvolle Nutzung der Vererbung ist. Ich kann nicht sagen, warum ich in diesem Fall glücklich bin, aber normalerweise nicht, wohlgemerkt...

4voto

Darin Dimitrov Punkte 990883

Da Sie kein Wörterbuch haben, können Sie keinen Wörterbuch-Initiator verwenden. Sie haben eine Liste, also könnten Sie einen Listeninitialisierer verwenden, der dem am nächsten kommt:

var l = new List<KeyValuePair<string, string>> 
{
    new KeyValuePair<string, string>("key1", "value1"),
    new KeyValuePair<string, string>("key2", "value2"),
};

Hier ist die Mindestanforderung für die Verwendung des Wörterbuchinitialisierers: Die Klasse muss die IEnumerable und die Klasse muss eine öffentliche Methode haben Add die 2 Argumente benötigt (wobei das erste Argument den Schlüssel und das zweite Argument den Wert darstellt). Sie könnten also eine benutzerdefinierte Klasse schreiben, die diese Anforderungen erfüllt, und Sie können die Syntax verwenden, die Sie in Ihrer Frage gezeigt haben.

1voto

Raeeyesis Punkte 81

Der von Ihnen eingegebene Code funktioniert einwandfrei - im Anschluss an Mads Togersen's Beitrag über die Implementierung von Sammlungsinitialisierern, bildet der Compiler die durch Klammern getrennten Einträge ( {"key1", "value1"} oben) zu einer Add-Methode der Sammlung mit der gleichen Signatur - in diesem Fall Dictionary.Add(TKey, TValue) .

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