2016-06-08 12 views
1

Gegeben, dass ich eine Sammlung von Objekten und eine Sammlung von Schlüssel = Wert-Paaren habe, wie würde ich ein Lambda (oder, wenn Lambda ist unangemessen, ein anderer Ausdruck), so dass die ursprüngliche Sammlung basierend auf den Einstellungen der zweiten .Verwenden von Lambdas zum Filtern mit einem mehrdimensionalen Array oder einer Karte von Filterparametern?

Beispiel: Eine Sammlung von Missionen und gegeben eine Karte enthält Typ = Flug und Ort = USA, zurück alle Flugmissionen in den USA.

Diese Frage ist in Verbindung mit einer anderen Frage, aber da sie getrennte Dinge sind, habe ich zwei Fragen daraus gemacht.

Angenommen, ich habe so etwas wie:

Dictionary<string, string> filters; //type and location are keys, flight and USA are the values, respectively 
List<Mission> missions; 

Bestehende Zur Zeit haben wir so etwas wie:

var badIds; 
return missions.Where(x => !badIds.contains(x.ids))) 
    .Select(x => x.ids); 

Die Sache ist, in diesem Fall, dass ich bei der Kompilierung wissen, dass ich filternde basierend auf IDs und verwenden Sie eine einzelne Dimension Array wie Sammlung, um es zu tun. Ich möchte zwei Dimensionen verwenden und nicht nur die Werte einschließen, nach denen ich suche, sondern auch den Parameter, nach dem gesucht werden soll, und gleichzeitig die Anzahl der Filtervorgänge basierend auf der Anzahl der Parameter dynamisch erweitern. Sie können eine, die andere, beide, mehr Parameter, weniger, in irgendeiner Kombination usw. angeben (0 Parameter können ein spezieller Fall sein, aber das ist einfach genug).

Ich möchte so etwas wie:

for (KeyValuePair kvp in filters) 
{ 
    missions = missions.Where(x => x.(kvp.Key) == kvp.Value); 
} 
//I'm new to lambdas and C# so this is probably terrible. 
+0

Möchten Sie dies auf einem ** bestimmten Typ ** wie Flugmissionen tun? Wenn ja, dann kann es leicht konstruiert werden. Wenn du es super-universal, nicht typbezogen machen willst, dann ist es möglich Reflektionen zu verwenden, aber brauchst du das wirklich? Wie auch immer, es wäre großartig, wenn Sie ein Codebeispiel wie * "Ich habe ** das ** und ich möchte etwas wie ** das **: ..." * zur Verfügung stellen. –

+3

Oft ist Text nicht das beste Medium, um ein Programmierproblem zu erklären. Sie sollten zumindest einen (Pseudo-) Code zeigen und vielleicht haben Sie sogar etwas versucht, und zeigen Sie es dann. –

+0

Wenn Sie dies für einen Webservice benötigen, können Sie sich oData ansehen – harmoniemand

Antwort

0

Aus Ihrer Beschreibung, ist es das, was ich sammeln Sie versuchen zu tun:

IEnumerable<Mission> FindMissions(IEnumerable<Mission> missions, string flight, string location) 
{ 
    var results = new List<Mission>(); 
    foreach (Mission m in missions) 
    { 
     if (m.Type == flight && m.Location == location) 
     { 
      results.Add(m); 
     } 
    } 
    return results; 
} 
+0

Das ist der starre Weg, es zu tun. Was ist, wenn sie keinen Typ angeben, sondern einen Ort und ein Datum angeben? Oder nur Datum? Sie benötigen etwas (Anzahl der durchsuchbaren Parameter)! Funktionen, um alles zu tun. Außerdem tippen Sie als Flug typo, der Variablenname sollte Typ sein, der Laufzeitwert kann Flug sein. – tenmiles

+1

Es klingt, als ob Sie nach einer allgemeineren Art der Suche suchen. Ich würde empfehlen, das [Spezifikationsmuster] (https://en.wikipedia.org/wiki/Specification_pattern) zu betrachten. –

0

ich meine eigene Lösung dieses Posting so kann es beurteilt werden. Lass mich wissen, was ihr denkt.

for (KeyValuePair kvp in filters) 
{ 
    missions = missions.Where(x => x.GetType().GetProperty(kvp.Key).GetValue(x, null) == kvp.Value; 
} 

Ich habe noch nie zuvor eine Reflexion durchgeführt, daher sind die Auswirkungen auf die Leistung unbekannt.

Verwandte Themen