Uso de LINQ para crear un diccionario a partir de una lista de cadenas delimitadas

Tengo una lista de cadenas que se ven así:

abc|key1|486997
def|key1|488979
ghi|key2|998788 
gkl|key2|998778
olz|key1|045669

¿Cómo puedo usar LINQ y ToDictionary para producir un Dictionary<string, List<string>> eso parece como

key1 : { abc|key1|486997, def|key1|488979, olz|key1|045669 }
key2 : { ghi|key2|998788, gkl|key2|998778 }

Básicamente, quiero poder extraer el segundo elemento como el uso clave de ToDictionary() para crear el diccionario de una sola vez.

Actualmente estoy haciendo esto..

 var d = new Dictionary<string, List<string>>();

            foreach(var l in values)
            {
                var b = l.Split('|');
                var k = b.ElementAtOrDefault(1);

                if (!d.ContainsKey(k))
                    d.Add(k, new List<string>());

                d[k].Add(l);
            }

He visto las preguntas sobre la creación de diccionarios a partir de una sola cadena de valores delimitados, pero me pregunto si hay una manera elegante de hacerlo cuando se comienza con una lista de cadenas delimitadas.

preguntado el 03 de mayo de 12 a las 18:05

3 Respuestas

var list = new []
{
"abc|key1|486997",
"def|key1|488979",
"ghi|key2|998788",
"gkl|key2|998778",
"olz|key1|045669"
};

var dict = list.GroupBy(x => x.Split('|')[1])
               .ToDictionary(x => x.Key, x => x.ToList());

También puede transformarlo en una búsqueda (que es muy similar a un Dictionary<K,IEnumerable<V>>) de una sola vez:

var lookup = list.ToLookup(x => x.Split('|')[1]);

contestado el 03 de mayo de 12 a las 19:05

¡Gracias! Esto es lo que terminé descubriendo. - pato

var data = new[]
                {
                    "abc|key1|486997",
                    "def|key1|488979",
                    "ghi|key2|998788",
                    "gkl|key2|998778",
                    "olz|key1|045669"
                };
var dictionary = data.Select(row => row.Split('|'))
  .GroupBy(row =>  row[1])
  .ToDictionary(group => group.Key, group => group);

contestado el 03 de mayo de 12 a las 19:05

Eso devolverá un Dictionary<string, IGrouping<string, string[]>> - vcsjones

@vcsjones Sí, sí lo hará. El OP no especificó un tipo deseado, por lo que no sabemos cómo querrá usarlo. - Servir

Citando OP: ¿Cómo puedo usar LINQ y ToDictionary para producir un Diccionario > - vcsjones

Si se garantiza que sus datos sean consistentes de esa manera, podría hacer algo como esto:

var data = new[]
                {
                    "abc|key1|486997",
                    "def|key1|488979",
                    "ghi|key2|998788",
                    "gkl|key2|998778",
                    "olz|key1|045669"
                };
var items = data
            .GroupBy(k => k.Split('|')[1])
            .ToDictionary(k => k.Key, v => v.ToList());

contestado el 03 de mayo de 12 a las 19:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.