4 Stimmen

Vergleich von Elementen in verschiedenen Wörterbüchern mit demselben Schlüssel mit LINQ

Ich habe zwei Wörterbücher mit einem String-Schlüssel und verschiedenen Werttypen.

private Dictionary<string, IProperty> _properties;
private Dictionary<string, Expectation> _expectations;

Ich muss Elemente vergleichen, die denselben Schlüssel haben und übereinstimmende Erwartungen erhalten. Hier ist meine Methode Signatur in Expectation Klasse.

public bool Matches(IProperty property)

Wie kann ich das mit LINQ erreichen?

5voto

Pranay Rana Punkte 170480

Wenn ich Sie richtig verstehe,

Sie können beide Sammlungen innerlich verbinden und dann den Wert zurückbekommen

var exp = form p in _properties
          join e in _expectations
          on p.key equals e.key
          select e;

Für Details können Sie dieses Bild ansehen: enter image description here

5voto

Thomas Levesque Punkte 277723
var result = from pKey in _properties.Keys
             where _expectations.ContainsKey(pKey)
             let e = _expectations[pKey]
             select e;

Sie ist effizienter als eine Verknüpfung, da sie die Schlüsselsuche in _expectations . Sie könnte durch die Verwendung einer solchen Erweiterungsmethode leicht verbessert werden:

public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key)
    where TValue : class
{
    TValue value;
    if (dictionary.TryGetValue(key, out value))
        return value;
    return null;
}

var result = from pKey in _properties.Keys
             let e = _expectations.GetValueOrDefault(pKey)
             where e != null
             select e;

(dadurch wird vermieden, dass der Schlüssel zweimal nachgeschlagen wird)

4voto

Cheng Chen Punkte 40879
var result = _expectations.Where(e => _properties.Any(p => p.Key == e.Key && e.Value.Matches(p.Value)));

1voto

AnorZaken Punkte 1637
var matches = _expectations.Where(
    kvp => _properties.ContainsKey(kvp.Key) && kvp.Value.Matches(_properties[kvp.Key]));

Wenn Sie wissen, dass der Schlüssel in beiden Wörterbüchern vorhanden ist, können Sie die ContainsKey ebenfalls überprüfen:

var matches = _expectations.Where(kvp => kvp.Value.Matches(_properties[kvp.Key]));

Das Ergebnis sind KeyValuePairs. Um direkt an die Expectations zu gelangen, fügen Sie einfach .Select(kvp => kvp.Value) zur oben genannten Methode der Wahl.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X