2009-03-09 12 views
190

Tengo una colección de MyClass que me gustaría consultar utilizando LINQ para obtener valores distintos, y obtengo un Dictionary < string, string> como resultado, pero No puedo entender cómo puedo hacerlo de manera más simple de lo que estoy haciendo abajo. ¿Qué podría ser un código más limpio que pueda usar para obtener la cadena del diccionario <, string> como resultado?Consulta de LINQ para devolver un diccionario <cadena, cadena>

var desiredResults = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); 

var queryResults = (from MyClass mc in myClassCollection 
        orderby bp.SomePropToSortOn 
        select new KeyValuePair<string, string>(mc.KeyProp, mc.ValueProp)).Distinct(); 

foreach (var item in queryResults) 
{ 
    desiredResults.Add(item.Key.ToString(), item.Value.ToString()); 
} 
+5

¿Qué quieres que haga con las llaves duplicadas? Solo toma el primero e ignora los siguientes? Tenga en cuenta que los diccionarios no están ordenados, por lo que su orden en la consulta no tendrá ningún efecto ... –

+1

Tal vez lo que está buscando es la implementación SortedDictionary de IDictionary. De lo contrario, ordenar un diccionario no tiene sentido. – Fede

Respuesta

318

Utilice el método ToDictionary directamente.

var result = 
    // as Jon Skeet pointed out, OrderBy is useless here, I just leave it 
    // show how to use OrderBy in a LINQ query 
    myClassCollection.OrderBy(mc => mc.SomePropToSortOn) 
        .ToDictionary(mc => mc.KeyProp.ToString(), 
           mc => mc.ValueProp.ToString(), 
           StringComparer.OrdinalIgnoreCase); 
+1

Mehrdad, gracias por el puntero sobre esto. Esta era la dirección en la que iba, pero debe haber estado pasando por alto la sobrecarga correcta de ToDictionary. –

15

Mira la ToLookup y/o ToDictionary métodos de extensión.

Cuestiones relacionadas