22 Stimmen

Gibt es eine bessere Möglichkeit, eine Hastable in .NET ohne Add-Methode zu initialisieren?

Ich bin derzeit eine Hashtable in der folgenden Weise initialisieren:

Hashtable filter = new Hashtable();
filter.Add("building", "A-51");
filter.Add("apartment", "210");

Ich bin auf der Suche nach einer schöneren Möglichkeit, dies zu tun.

Ich habe etwas ausprobiert wie

Hashtable filter2 = new Hashtable() {
    {"building", "A-51"},
    {"apartment", "210"}
};

Der obige Code lässt sich jedoch nicht kompilieren.

36voto

Paul Batum Punkte 7845

Der genaue Code, den Sie gepostet haben:

        Hashtable filter2 = new Hashtable()
        {
            {"building", "A-51"},
            {"apartment", "210"}
        };

Kompiliert perfekt in C# 3. Da Sie Kompilierungsprobleme gemeldet haben, nehme ich an, dass Sie C# 2 verwenden? In diesem Fall können Sie zumindest dies tun:

        Hashtable filter2 = new Hashtable();
        filter2["building"] = "A-51";
        filter2["apartment"] = "210";

9voto

mattlant Punkte 15146

In C# 3 sollte es wie folgt kompiliert werden:

Hashtable table = new Hashtable {{1, 1}, {2, 2}};

0 Stimmen

Bei Objektinitialisierungen sind die Konstruktor-Parens optional?

0 Stimmen

Wenn Sie einen leeren Ctor haben, ya

0voto

JeeBee Punkte 17329

(Kein C#-Experte)

Dies ist syntaktischer Zucker, und wenn es sich um syntaktischen Zucker handelt, möchte ich, dass die Zuordnung (in einer Hashtabelle) schön und offensichtlich ist:

Hashtable filter2 = new Hashtable() { "building" => "A-51", "apartment" => "210"};

Ich sehe jedoch keine wirkliche Notwendigkeit dafür, denn es spricht nicht viel dagegen, nach der Initialisierung einfach add aufzurufen.

(Ich kenne Leute, die mit dem Java-Compiler herumhacken, um ähnliche Dinge in der Vergangenheit für Java zu erreichen (was einige Jahre später große Probleme bei der Umstellung auf Java 5 verursachte), ich nehme an, dass dies für C# keine Option ist).

0 Stimmen

Es gibt eine Notwendigkeit, wenn Sie es inline hinzufügen müssen: someclass.AddTable(new HashTable { { 1, "A" }, {2, "b"} } );

0voto

Ta01 Punkte 30128

Ich hatte keine Ahnung in C# 3.0 Hashtable table = new Hashtable {{1, 1}, {2, 2}}; kompilieren würde.

Wie auch immer, die Umsetzung des armen Mannes:

Meh, Sie könnten die Hashtable-Klasse erweitern:

class MyHashTable : System.Collections.Hashtable    
{
    public MyHashTable(string [,] values)
    {
        for (int i = 0; i < (values.Length)/2; i++)
        {
            this.Add(values[i,0], values[i,1]);
        }
    }
}

Und dann von einer Konsolenanwendung aus:

    class Program
{
    static void Main(string[] args)
    {
        string[,] initialize = { { "building", "A-51" }, { "apartment", "210" }, {"wow", "nerf Druids"}};

        MyHashTable myhashTable = new MyHashTable(initialize);
        Console.WriteLine(myhashTable["building"].ToString());
        Console.WriteLine(myhashTable["apartment"].ToString());
        Console.WriteLine(myhashTable["wow"].ToString());
        Console.ReadKey();

    }
}

zur Folge haben wird:
A-51
210
Druiden verschlimmbessern

dies wurde schnell getan, so kann es in bestimmten Situationen Bombe, aber dann wieder.

0 Stimmen

Vielleicht object[,] ? denn man kann jedes (unveränderliche) Objekt als Hashtable-Schlüssel verwenden, nicht nur Strings. Und btw, Drus haben genug Nerfing gesehen :) Magier auch ;) (Haftungsausschluss: nicht so unglücklicher Magier :))

-1voto

SeaDrive Punkte 3892

Ich denke, die eigentliche Frage, die gestellt wird, bezieht sich auf denkbare Konstrukteure wie z. B.:

HashTable ht = new HashTable(MeinArray) ; // aus Array füllen

HashTable ht = new HashTable(MyDataTable) ; // aus Datentabelle füllen

AFAIK ist die Antwort "nein", aber Sie könnten es selbst schreiben. Ich nehme an, der Grund dafür, dass solche Methoden nicht in der Bibliothek sind, ist, dass das Array oder die DataTable richtig geformt sein muss. Es ist kein so großer Verlust, da jede Implementierung dieser Methoden wahrscheinlich sowieso die Add-Methode in einer Schleife verwenden würde.

0 Stimmen

Objektinitialisierungen, wie sie der Poster gepostet hat, sind Teil der C# 3 Sprachspezifikation. Der Compiler nimmt den Code und kompiliert ihn in Add-Aufrufe. So ziemlich jede Klasse, die eine Add-Methode hat (die IEnumerable implementiert), kann auf diese Weise initialisiert werden.

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