2009-09-06 10 views
26

¿Existe una función incorporada para convertir una matriz de cadenas en un diccionario de cadenas o necesita hacer un ciclo aquí?La manera más elegante de convertir una matriz de cadenas en un diccionario de cadenas

+0

Depende de la estructura que desea todo en todos. Sin embargo, terminarás con un ciclo, sin importar cómo lo mires. –

+3

Siempre habrá un bucle en alguna parte, pero LINQ le permite ocultarlo, es decir, no necesita tener el bucle en * su * código. –

Respuesta

63

Suponiendo que está utilizando .NET 3.5, puede convertir cualquier secuencia (es decir IEnumerable<T>) en un diccionario:

var dictionary = sequence.ToDictionary(item => item.Key, 
             item => item.Value) 

donde Key y Value son las propiedades adecuadas que desea actuar como clave y valor Puede especificar solo una proyección que se utiliza para la clave, si el elemento en sí es el valor que desea.

Así, por ejemplo, si desea asignar la versión mayúscula de cada cuerda a la original, se puede utilizar:

var dictionary = strings.ToDictionary(x => x.ToUpper()); 

En su caso, ¿qué quieres las claves y valores que sean?

Si en realidad sólo quiere un conjunto (que se puede comprobar para ver si contiene una cadena en particular, por ejemplo), puede utilizar:

var words = new HashSet<string>(listOfStrings); 
+0

Ese risc siempre está ahí, a menos que revise antes para obtener claves duplicadas. – Dykam

+0

@Dykam: De hecho. Si desea manejar duplicados, posiblemente desee 'ToLookup' en su lugar. Con suerte, descubriremos más si el OP explica lo que realmente están tratando de hacer. –

+0

¡Genial! ¿Qué sucede si tengo una matriz de cadenas de cadenas y una serie de valores de la misma longitud? ¿Puede Linq ayudarme entonces? –

3

¿Qué quieres decir?

Un diccionario es un hash, donde las teclas se asignan a los valores.

¿Cuáles son sus claves y cuáles son sus valores?

foreach(var entry in myStringArray) 
    myDictionary.Add(????, entry); 
12

Puede utilizar LINQ para hacer esto, pero la pregunta que Andrew le pregunta debe ser contestada primero (cuáles son sus claves y valores):

using System.Linq; 

string[] myArray = new[] { "A", "B", "C" }; 
myArray.ToDictionary(key => key, value => value); 

el resultado es un diccionario de esta manera:

A -> A 
B -> B 
C -> C 
4

Si necesita un diccionario sin valores, puede que necesite un HashSet:

var hashset = new HashSet<string>(stringsArray); 
2

OMI, cuando decimos una Array estamos hablando de una lista de valores que podemos obtener un valor con llamar a su índice (valor => matriz [índice]), por lo que un diccionario correcto es un diccionario con una clave de índice.

Y con gracias a @ John Skeet, la forma correcta de lograr esto es:

var dictionary = array 
    .Select((v, i) => new {Key = i, Value = v}) 
    .ToDictionary(o => o.Key, o => o.Value); 

Otra forma es utilizar un método de extensión de esta manera:

public static Dictionary<int, T> ToDictionary<T>(this IEnumerable<T> array) 
{ 
    return array 
     .Select((v, i) => new {Key = i, Value = v}) 
     .ToDictionary(o => o.Key, o => o.Value); 
} 
+0

Esto a) será ineficiente; b) falla si el mismo valor ocurre más de una vez en la matriz. Podría usar la sobrecarga 'Select', que también proporciona el índice, para hacer esto de manera más eficiente y confiable. –

+0

Gracias, y edito el código como se hizo referencia para usar 'Seleccionar';). –

Cuestiones relacionadas