Uso de LINQ para crear un diccionario a partir de una lista de cadenas delimitadas
Frecuentes
Visto 1,687 veces
2
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.
3 Respuestas
4
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
1
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
1
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 c# linq dictionary or haz tu propia pregunta.
Posible duplicado: stackoverflow.com/questions/10400213/… - SupremeDud