Query LINQ per restituire un dizionario <stringa, stringa>


218

Ho una raccolta di MyClass che vorrei interrogare usando LINQ per ottenere valori distinti e ottenere un dizionario <stringa, stringa> come risultato, ma non riesco a capire come posso farlo in modo più semplice di me sto facendo di seguito. Quale sarebbe un codice più pulito che posso usare per ottenere il dizionario <stringa, stringa> come risultato?

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());
}

6
Cosa vuoi che faccia con le chiavi duplicate? Basta prendere il primo e ignorare quelli successivi? Ricorda che i dizionari non sono ordinati, quindi il tuo ordine nella query non avrà alcun effetto ...
Jon Skeet

1
Forse quello che stai cercando è l'implementazione SortedDictionary di IDictionary. Altrimenti l'ordinamento su un dizionario è inutile.
Fede il

Risposte:


366

Usa il ToDictionarymetodo direttamente.

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, grazie per il puntatore su questo. Questa era la direzione in cui stavo andando, ma per aver dovuto trascurare il corretto sovraccarico di ToDictionary.
Scott Ivey,

18

Guarda i metodi di estensione ToLookupe / o ToDictionary.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.