Frage

Ich habe eine Methode, die eine Expression<Func<T, bool>> als Parameter akzeptiert. Ich möchte es als Prädikat in der List.Find () Methode verwenden, aber ich kann es nicht zu einem Prädikat zu konvertieren scheine die Liste nimmt. Kennen Sie eine einfache Möglichkeit, dies zu tun?

public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new()
{
    var list = GetList<T>();

    var predicate = [what goes here to convert expression?];

    return list.Find(predicate);
}

Aktualisieren

Die Kombination von Antworten von tvanfosson und 280Z28, ich bin jetzt so aus:

public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new()
{
    var list = GetList<T>();

    return list.Where(expression.Compile()).ToList();
}
War es hilfreich?

Lösung

Func<T, bool> func = expression.Compile();
Predicate<T> pred = t => func(t);

Edit: nach den Kommentaren, die wir haben eine bessere Antwort für die zweite Zeile:

Predicate<T> pred = func.Invoke;

Andere Tipps

Ich sehe nicht die Notwendigkeit für diese Methode. Verwenden Sie einfach Wo ().

 var sublist = list.Where( expression.Compile() ).ToList();

oder noch besser definiert den Ausdruck als Lambda-inline.

 var sublist = list.Where( l => l.ID == id ).ToList();

Weitere Optionen, die nicht erwähnt worden ist:

Func<T, bool> func = expression.Compile();
Predicate<T> predicate = new Predicate<T>(func);

Dies erzeugt die gleichen wie IL

Func<T, bool> func = expression.Compile();
Predicate<T> predicate = func.Invoke;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top