2010-07-15 3 views
8

Ich versuche, alle Schlüssel in einem Wörterbuch zu finden, die nicht in einem anderen Wörterbuch sind. Natürlich kann ich dies mit einer verschachtelten Schleife tun, aber ich versuche gerade, LINQ zu lernen, und ich fragte mich, ob ich es vielleicht benutzen könnte, um diese Aufgabe zu erfüllen.Verwenden von LINQ, um alle Schlüssel aus einer Sammlung zu finden, die sich nicht in einer anderen befinden?

Hier ist, was ich bisher:

Dictionary<string, List<string>> DBtables = this.CollectTableListings(); 
var generic = from Dictionary<string,List<string>> tab 
       in DBtables 
       where !_tables.ContainsKey(???) 
       select tab; 

Jede Idee, was anstelle der Fragezeichen (oder vielleicht statt der gesamten where-Klausel) gehen sollte?

+0

Als Anmerkung, ist es nicht erforderlich, den Typ vor „Register“ im Code Sie auf dem Laufenden. – Kirk

Antwort

11

können Sie tun:

var resultKeys = DBTables.Keys.Except(_tables.Keys); 

Die Except() Verfahren ist im Wesentlichen die gleiche wie die minus Operationen in SQL - es gibt alle Elemente aus der ersten Kollektion die in der zweiten ausgenommen. Da Wörterbücher ihre Schlüssel offen legen, können Sie ihren Unterschied auf diese Weise berechnen.

Der Operator Except() verwendet die Standardgleichheit für den Typ, aber es gibt auch eine Überladung, mit der Sie Ihren eigenen IEqualityComparer angeben können, um die Semantik des Vergleichs von Werten zu überschreiben. In Ihrem Beispiel brauchen Sie das wahrscheinlich nicht - aber es ist schön, es dort zu wissen.

+4

Bitte beachten Sie, außer() 'Returns ** Distinct ** Ergebnisse. Während dies in diesem Beispiel gewünscht sein kann, ist es erwähnenswert für die Verwendung in anderen Implementierungen. – Aren

+0

@Aren B: Richtig, aber im Fall eines 'Dictionary <>' sind die Schlüssel bereits garantiert eindeutig. – LBushkin

+1

Ich weiß, deshalb habe ich festgestellt, dass dieses Beispiel gewünscht ist. Aber jemand kann über diesen Thread auf der Suche nach einer * List Subtraktion * stolpern und denken, dass 'Except()' ihre Probleme lösen könnte. Deshalb habe ich gesagt, es war es wert, darauf hingewiesen zu werden. – Aren

2
Dictionary<string, List<string>> dictOne = ... 
Dictionary<string, List<string>> dictTwo = ... 

var missingKeys = dictOne.Keys.Where(x => !dictTwo.ContainsKey(x)); 
1
Dictionary<string, List<string>> dictionary = this.CollectTableListings(); 
Dictionary<string, List<string>> otherDictionary = getOtherTable(); 

var keys = from key in dictionary.Keys 
      where !otherDictionary.Keys.Contains(key) 
      select key; 

(Aber LBuskin Antwort ist viel besser)

0

einen Blick auf die Except Extension-Methode haben. HTH.

0

Wenn Sie verwenden Abfragesyntax wollte ich so etwas wie unten tun würde:

var keys = from d1 in dictionary1 
      select d1.Key; 
var items = from d2 in dictionary2 
      where d2.Key in keys 
      select d2; 
foreach(var item in items) 
{ 
} 
Verwandte Themen