2009-12-17 8 views
6

Ich Refactoring diesen Code und versuchte zu denken, eine einfache linq Ausdruck dieses Wörterbuch zu füllen.Hilfe Linqify Sammlung zu Dictionary

IEnumerable<IHeaderRecord> headers = PopulateHeaders(); 
var headerLocationLookup = new Dictionary<string, IHeaderRecord>(); 

foreach (var header in headers) 
{ 
//destination locations can repeat, if they do, dictionary should only contain the first header associated with a particular location 
    if (!headerLocationLookup.ContainsKey(header.DestinationLocation)) 
    { 
     headerLocationLookup[header.DestinationLocation] = header; 
    } 
} 

Ich konnte nur mit der Implementierung eines benutzerdefinierten IEqualityComparer kommen und die Verwendung dieser in einem Ausdruck wie dieser ...

headers.Distinct(new CustomComparer()).ToDictionary(); 

Gibt es einen Weg, um alles Inline ohne den benutzerdefinierten IEqualityComparer zu tun? Danke im Voraus.

Antwort

13
var qry = headers.GroupBy(row => row.DestinationLocation) 
     .ToDictionary(grp => grp.Key, grp => grp.First()); 

oder (äquivalent):

var dictionary = (from row in headers 
       group row by row.DestinationLocation) 
       .ToDictionary(grp => grp.Key, grp => grp.First()); 

Ich frage mich aber, wenn Ihr aktueller foreach Code nicht schon besser ist - es ist nicht die, die puffert es zum Beispiel fallen will.

+1

Gute Antwort. Ich denke, Sie haben Recht, dass der aktuelle Code klarer ist. –

2
var headerLocationLookup = PopulateHeaders() 
    .Aggregate(new Dictionary<string, IHeaderRecord>(), (header, d) => { 
     if(d.ContainsKey(header.DestinationLocation)) 
      d[header.DestinationLocation] = header; 

     return d; 
    }); 

Ich glaube nicht, dass dies klarer als der vorhandene Code ist.

5

Ich schrieb einen blog post eine Weile zurück, die Ihnen zeigt, wie Sie Überlastungen von Distinct, die einen Lambda-Ausdruck als Schlüsselschalter anstelle eines benutzerdefinierten comparer erstellen können, die Sie lassen würde schreiben:

headers.Distinct(h => h.DestinationLocation) 
     .ToDictionary(h => h.DestinationLocation); 

Es verwendet einen benutzerdefinierten Vergleicher unterhalb, aber die Erweiterungsmethode konstruiert dieses Zeug für Sie und macht es viel einfacher zu lesen.

+1

Das ist sehr angenehm auf das Auge. –

Verwandte Themen