Consulta LINQ para devolver un Diccionario <string, string>

218

Tengo una colección de MyClass que me gustaría consultar usando LINQ para obtener valores distintos, y obtener un Diccionario <string, string> como resultado, pero no puedo entender cómo puedo hacerlo de una manera más simple que yo Estoy haciendo abajo. ¿Cuál sería un código más limpio que pueda usar para obtener el Diccionario <string, string> como resultado?

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());
}
Scott Ivey
fuente
66
¿Qué quieres que haga con las claves duplicadas? ¿Solo toma el primero e ignora los siguientes? Tenga en cuenta que los diccionarios no están ordenados, por lo que su ordenación en la consulta no tendrá ningún efecto ...
Jon Skeet
1
Quizás lo que está buscando es la implementación SortedDictionary de IDictionary. De lo contrario, la ordenación sobre un Diccionario no tiene sentido.
Fede

Respuestas:

366

Usa el ToDictionarymétodo 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);
Mehrdad Afshari
fuente
1
Mehrdad, gracias por el puntero sobre esto. Esta era la dirección en la que iba, pero debe haber pasado por alto la sobrecarga correcta de ToDictionary.
Scott Ivey
18

Mira los métodos de extensión ToLookupy / o ToDictionary.

leppie
fuente