Linq Func / Expression Lokale Bewertung

expression-trees linq

Frage

Mit diesem Code:

        int min = 0;

        Expression<Func<List<IUser>, bool>> ulContainsJohn = 
                    (l => l.Where(u => u.FirstName == "John").Count() > min);

        Assert.AreEqual(true, ulContainsJohn.Compile()(userList));

        min = 3;

        Assert.AreEqual(true, ulContainsJohn.Compile()(userList));

Die Liste enthält 1 "John", aber die zweite Assert schlägt fehl. Wie binde ich den Wert von min eifrig an den Func, also versucht er nicht, die Variable min neu zu bewerten?

Klarstellung: Ich möchte die Signatur nicht ändern. Ich möchte, dass der Ausdrucksbaum min nicht als Variable, sondern als konstanten Ausdruck bewertet. Gibt es trotzdem eine Konvertierung der Auswertung von min, so dass der Baum einen konstanten Ausdruck anstelle einer variablen Auswertung hat?

Akzeptierte Antwort

Bearbeiten: Lesen Sie Ihren Kommentar, versuchen Sie einen Funktionsersteller.

Func<int, Func<List<IUser>, bool>> createFn = (min) =>
    (l) => (l.Count(u => u.FirstName == "John") > min);

Func<List<IUser>, bool>> contains0 = createFn(0);

Assert.AreEqual(true, contains0(userList));

Func<List<IUser>, bool>> contains3 = createFn(3);

Assert.AreEqual(true, contains3(userList));

Versuchen Sie, ein 1-Element-Array zu verwenden. Hässlich, aber es funktioniert.

Func<int, Func<List<IUser>, bool>> createFn = (min) =>
    (l) => (l.Count(u => u.FirstName == "John") > min);

Func<List<IUser>, bool>> contains0 = createFn(0);

Assert.AreEqual(true, contains0(userList));

Func<List<IUser>, bool>> contains3 = createFn(3);

Assert.AreEqual(true, contains3(userList));

Eine andere Option, besser:

Func<int, Func<List<IUser>, bool>> createFn = (min) =>
    (l) => (l.Count(u => u.FirstName == "John") > min);

Func<List<IUser>, bool>> contains0 = createFn(0);

Assert.AreEqual(true, contains0(userList));

Func<List<IUser>, bool>> contains3 = createFn(3);

Assert.AreEqual(true, contains3(userList));

Beliebte Antwort

Sie müssten es zu einem Parameter machen.

    Expression<Func<List<IUser>, int,  bool>> ulContainsJohn = 
                (List<IUser> l, int min) =>  (l.Where(u => u.FirstName == "John").Count() > min);


    ulContainsJohn.Compile()(userList, min);



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum