3 Stimmen

C# LINQ Vergleich von Listenwerten

Ich habe zwei Listen von zwei verschiedenen benutzerdefinierten Typen. Beide Typen teilen sich 2 gemeinsame Eigenschaften.

Zum Beispiel:

List;
List;

Beide haben z.B. Eigenschaften mit dem Namen Name und Alter.

Ich möchte eine neue Liste zurückgeben, die alle bar-Objekte enthält, bei denen die Eigenschaften Name und Alter von bar in einem der foo-Objekte vorhanden sind. Wie wäre der beste Weg, dies zu tun?

Danke

11voto

Jon Skeet Punkte 1325502

Vorausgesetzt, die gemeinsamen Eigenschaften implementieren die Gleichheit usw. ordnungsgemäß, könnten Sie etwas Ähnliches tun:

// Irgendwo in einer Erweiterungsklasse. Das sollte wirklich in der Standardbibliothek sein.
// Wir brauchen es für die Typinferenz.
public static HashSet ToHashSet(this IEnumerable items)
{
    return new HashSet(items);
}

var shared = foos.Select(foo => new { foo.SharedProperty1, foo.SharedProperty2 })
                 .ToHashSet();

var query = bars.Where(bar => shared.Contains(new { bar.SharedProperty1,
                                                    bar.SharedProperty2 }));

Die anderen Optionen mit Joins werden sicherlich funktionieren - aber ich finde dies klarer, um die Idee auszudrücken, dass Sie jede bar-Eintrag nur einmal betrachten möchten, auch wenn es mehrere foo-Elemente mit dieser Eigenschaft gibt.

3voto

Justin Niessner Punkte 235353

Klingt so, als bräuchtest du ein Join:

var fooList = new List();
var barList = new List();

// Listen füllen

var results = from f in fooList
              join b in barList on 
                  new { f.commonPropery1, f.commonProperty2 }
                  equals 
                  new { b.commonProperty1, commonProperty2 = b.someOtherProp }
              select new { f, b };

1voto

Zebi Punkte 8414

Any sollte funktionieren, wenn es nicht darauf ankommt, wie viele foo's übereinstimmen:

var selectedBars = bars.Where(bar => 
                                foos.Any(foo => foo.Property1 == bar.Property1 
                                             && foo.Property2 == bar.Property2));

Wenn alle foos übereinstimmen sollen, verwenden Sie All

var selectedBars = bars.Where(bar => 
                                foos.All(foo => foo.Property1 == bar.Property1 
                                             && foo.Property2 == bar.Property2));

Wenn die Liste der foos groß ist, verwenden Sie eine HashSet wie in John Skeets Antwort erwähnt.

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