Ich versuche, einen dynamischen Filter mit einer Kombination von Lambda-Funktionen zu erstellen. Die Anzahl der Lambda-Funktionen kann jedoch abhängig von der Anzahl der verschiedenen Filter variieren, die der Benutzer anwendet.Kombinieren mehrerer Lambda-Funktionen zusammen mit effizienter Ausführung
ich etwas, das wie dieses
//images is a List<ImageInfo>
var result1 = images
.Where(image => image.Bytes < 1000)
.Where(image => image.Height < 100)
.Where(image => image.Width < 100);
verhält Wo die Höhe Filter nur auf jene Bilder, die die Bytes Filter passieren angewendet wird. Und der Breitenfilter wird nur von solchen Bildern angewendet, die den Höhenfilter passieren.
Aber die dynamische Art und Weise, wie die Filter von den Benutzern ein- und ausgeschaltet werden, erlaubt mir nicht, eine einzige Lambda-Funktion zu erstellen.
Stattdessen werde ich eine Liste von Lambda-Funktionen erstellen und sie dann auf die Liste der Bilder anwenden. So würde ich mit so etwas enden; mehrere individuelle Lambda-Funktionen.
var filter1 = images.Where(image => image.Bytes < 1000);
var filter2 = images.Where(image => image.Height < 100);
var filter3 = images.Where(image => image.Width < 100);
Wie kann ich mehrere Lambda-Funktionen zusammenfügen, um meine endgültige Liste gefilterter Bilder zu erhalten?
Ich habe diese
var result = filter1.Intersect<ImageInfo>(filter2).Intersect<ImageInfo>(filter3);
Aber jeder Filter dreht sich durch die Hauptliste der Bilder seine Teilmenge der Bilder zu bekommen, und dann tut eine Kreuzung Berechnung, die viel zu viel CPU nimmt.
Also was ich suche ist eine Möglichkeit, eine beliebige Liste von Lambda-Funktionen (Ausdrücke ... was auch immer) zu nehmen und sie auf eine Weise zu verbinden, die so ausgeführt wird, wie das erste Beispiel, das ich zeigte.
Es stimmt, ich könnte das tun, aber weil die Liste der Filter ziemlich dynamisch ist (neue jederzeit von jedem hinzugefügt werden könnte Quelle) Ich möchte die Lambda-Funktion in einer Liste von Lambda-Funktionen speichern, und dann durch die Liste drehen und sie einzeln anwenden. –
Wie speichern Sie eine Lambda-Funktion als Variable? –
Denken Sie daran, dass Lambdas nur Delegaten sind (ein Funktionsaufruf). Von meiner Antwort "Func, IEnumerable >" das ist der Typ für einen Delegaten, der ein IEnum von imageinfo nimmt und dasselbe zurückgibt –