¿Cómo combinar dos listas de diferentes tipos en una lista de nuevo tipo que contiene ambos tipos?

Deseo combinar/fusionar/unir/lo que sea una lista de enum s, de modo que cada elemento de la lista unificada tenga dos campos: el nombre del elemento enum ( string Nombre ) y su valor ( 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));

Cómo escribir el cuerpo del siguiente método (preferiblemente LINQ-wise)?

InTheDarknessBindThem(IEnumerable tokens, IEnumerable names) {
    /*
        ...
    */
}
0
@JonSkeet, eso es obvio, pero no es el punto. Es solo una demostración simple de lo que quiero lograr: el objetivo es tener un Dictionary para algún tipo de analizador, y cada enum puede decorarse con atributos (pero no tiene que ...)
agregado el autor Tar, fuente
¿Por qué simplemente no debería llamar a ToString() en cada valor para obtener el nombre? No es necesario obtener los nombres y valores por separado.
agregado el autor Jon Skeet, fuente
@Tal: Por favor, den un ejemplo más representativo. No está claro cómo encaja un diccionario aquí, o lo que realmente tendrías ...
agregado el autor Jon Skeet, fuente
+1 para nombres de métodos creativos
agregado el autor Servy, fuente

2 Respuestas

Si ambas listas están en orden, puede usar Método de extensión Zip :

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

This will return an IEnumerable>.

Pero como Jon Skeet sugiere , en este caso, probablemente sería más fácil hacer algo como esto:

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

Esto devolverá el mismo resultado que el anterior, pero lo hará en un solo paso.

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
agregado
¡Tu primera respuesta es lo que estaba buscando! ¡Gracias! El resto son obvios, pero debo procesar algo antes de agregarlos al diccionario, en todo caso : atribuir atributos (y actuar en consecuencia) y manipulaciones Regexp, por nombrar algunos ...
agregado el autor Tar, fuente
De hecho, probablemente pueda hacerlo en una sola consulta LINQ (y como usted mismo, no estoy 100% seguro al respecto ...), pero como probablemente ya sepa, en términos de legibilidad es mucho mejor no hacerlo. En este caso, hay un montón de código dentro del foreach que viene después (y esa es otra razón por la que no proporcioné todo el código)
agregado el autor Tar, fuente
@Tal Podría probablemente hacer todo (o la mayoría) de eso en una única consulta de linq también. Pero me alegro de poder ayudar.
agregado el autor p.s.w.g, fuente

¿Por qué no un diccionario?

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);
}

La impresión es un poco discutible ya que se llama a ToString() en el valor.

Creo que usar enum como clave en un boxeo de casos de diccionario.

0
agregado