Wie füge ich zwei Listen verschiedener Typen zu einer Liste eines neuen Typs zusammen, der beide Typen enthält?

Ich möchte eine Liste von enum s kombinieren/zusammenführen/beitreten/was auch immer, so dass jedes Element in der vereinigten Liste zwei Felder hat - den Namen des Elements enum ( string Name ) und sein Wert ( TokensEnum Token ):

var tokens = Enum.GetValues(typeof (TokensEnum));
var names = Enum.GetNames(typeof (TokensEnum));

var combined = InTheDarknessBindThem(tokens,names);

foreach(var c in combined)
    MessageBox.Show(string.Format(
        "Token \"{0}\" value is {1}", c.Name, (int)c.Token));

Wie schreibe ich den Körper der folgenden Methode (vorzugsweise LINQ-weise)?

InTheDarknessBindThem(IEnumerable tokens, IEnumerable names) {
    /*
        ...
    */
}
0
@ JonSkeet, das ist offensichtlich, aber nicht der Punkt. Es ist nur eine einfache Demonstration für das, was ich erreichen möchte: Das Ziel ist es, eine Dictionary für eine Art von Parser zu haben, und jede enum kann dekoriert werden mit Attributen (muss aber nicht ..)
hinzugefügt der Autor Tar, Quelle
Warum sollten Sie nicht einfach ToString() für jeden Wert aufrufen, um den Namen zu erhalten? Es ist nicht notwendig, die Namen und Werte separat zu erhalten.
hinzugefügt der Autor Jon Skeet, Quelle
@Tal: Bitte geben Sie ein repräsentativeres Beispiel. Es ist nicht klar, wie ein Wörterbuch hier hineinpasst oder was du eigentlich hättest ...
hinzugefügt der Autor Jon Skeet, Quelle
+1 für kreative Methodennamen
hinzugefügt der Autor Servy, Quelle

2 Antworten

Wenn beide Listen in Ordnung sind, können Sie die Zip Erweiterungsmethode:

tokens.Cast().Zip(names, (t, n) => Tuple.Create(t, n));

This will return an IEnumerable>.

Aber wie Jon Skeet schlägt vor , in diesem Fall wäre es wahrscheinlich einfacher, so etwas zu tun:

Enum.GetValues(typeof(TokensEnum))
    .Cast()
    .Select(t => Tuple.Create(t, t.ToString()));

Dies wird das gleiche Ergebnis wie oben, aber es wird es in einem einzigen Schritt tun.

Since you mentioned in your comments that you'd like to have a Dictionary, you can use something like this to construct it:

Dictionary myDictionary = 
    Enum.GetValues(typeof(TokensEnum))
        .Cast()
        .ToDictionary(t => t.ToString());
0
hinzugefügt
Ihre erste Antwort ist, wonach ich gesucht habe! Vielen Dank! Der Rest ist offensichtlich, aber ich muss etwas verarbeiten, bevor ich sie zum Wörterbuch hinzufüge, wenn überhaupt: Attribut-Abrufen (und entsprechend handeln) und Regexp-Manipulationen, um nur ein paar zu nennen.
hinzugefügt der Autor Tar, Quelle
In der Tat, ich kann es wahrscheinlich in einer einzigen LINQ-Abfrage tun (und wie Sie selbst, ich bin mir nicht 100% sicher ..), aber wie Sie wahrscheinlich bereits wissen, ist es in Bezug auf Lesbarkeit viel besser, es nicht zu tun. In diesem Fall gibt es eine Menge Code innerhalb des foreach , der danach kommt (und das ist ein weiterer Grund, warum ich den ganzen Code nicht bereitgestellt habe)
hinzugefügt der Autor Tar, Quelle
@Tal Sie könnten wahrscheinlich auch alle (oder die meisten) davon in einer einzigen linq-Abfrage machen. Aber froh, dass ich helfen konnte.
hinzugefügt der Autor p.s.w.g, Quelle

Warum nicht ein Wörterbuch?

var dict = Enum.GetValues(typeof (TokensEnum))
               .Cast()
               .ToDictionary(x => x, x => x.ToString());
foreach (var kvp in dict)
{
    Console.WriteLine("Value: {0}, Name: {1}",kvp.Key,kvp.Value);
}

Der Ausdruck ist ein bisschen falsch, da ToString() aufgerufen wird.

Ich denke, enum als Schlüssel in einem Wörterbuch Fälle Boxen zu verwenden.

0
hinzugefügt