2012-06-19 14 views
49

ich eine Liste von Parametern wie dieses:Überprüfen Sie, ob die Liste <t> enthält jede einer anderen Liste

public class parameter 
{ 
    public string name {get; set;} 
    public string paramtype {get; set;} 
    public string source {get; set;} 
} 

IEnumerable<Parameter> parameters; 

Und ein Array von Strings ich es gegen überprüfen möchten.

string[] myStrings = new string[] { "one", "two"}; 

Ich möchte über die Parameterliste zu durchlaufen und überprüfen, ob die Quelleigenschaft gleich einem der myStrings Array ist. Ich kann dies mit verschachtelten foreach's tun, aber ich würde gerne lernen, wie man es auf eine schönere Art und Weise macht, da ich mit linq herumspielte und die Erweiterungsmethoden auf aufzählbar wie wo usw. so geschachtelte foreachs einfach falsch fühlen. Gibt es einen eleganteren bevorzugten linq/lambda/delegete Weg, dies zu tun?

Dank

Antwort

105

Sie ein verschachteltes Any() für diese Prüfung, die auf jedem Enumerable nutzen könnten verfügbar:

bool hasMatch = myStrings.Any(x => parameters.Any(y => y.source == x)); 

Schnellere Durchführen von größeren Sammlungen

wäre zu projizieren parameters- source und dann Intersect verwenden, die intern verwendet eine HashSet<T> so anstelle von O (n^2) für den ersten Ansatz (das Äquivalent von zwei verschachtelte Schleifen) können Sie die Überprüfung in O (n):

bool hasMatch = parameters.Select(x => x.source) 
          .Intersect(myStrings) 
          .Any(); 

Auch als Nebenkommentar sollten Sie Ihre Klassennamen und Eigenschaftsnamen in Übereinstimmung mit den C# -Stilrichtlinien schreiben.

+0

danke scheint, was ich suche ich werde es ausprobieren. Man muss etwas mehr mit der funktionalen Seite der Dinge herumspielen. in Bezug auf die Kapitalisierung von Klasse und Eigenschaften, ich habe nur vergessen, wenn das obige Beispiel geschrieben. – gdp

+0

Warum O (n^2)? Ist es nicht O (n * m), wie wir reden, zwei Variablen und nicht eine? Da m (die Parameter) eine Konstante sind, ist es dasselbe wie O (n). Ich sehe nicht, wie Schnitt hier viel schneller sein sollte? Aber vereinbart, hat Intersect das Potenzial, schneller zu sein, ist aber nicht garantiert. – Squazz

+0

Sie haben Recht, dass es O (n * m) sein sollte - m ist jedoch keine Konstante - es ist die Größe einer der Listen, obwohl es in dem gegebenen Beispiel "2" sein könnte. Selbst konstante Werte sind in der Praxis nicht vernachlässigbar - für alle nicht-trivialen Listenlängen ist die "Schnittmenge" schneller - wenn die Listen trivial sind, spielt es keine Rolle (in diesem Fall ist die Performance wahrscheinlich nicht Ihr Anliegen) überhaupt überhaupt) – BrokenGlass

Verwandte Themen