2010-07-20 22 views
14

İki lambda ifadesini bir OR? Kullanılarak nasıl birleştirebilirim?Lambda ifadeleri ve bunları nasıl birleştireceksiniz?

ancak ben yeni lambda geçirilen değeri her çocuk lambda üzerine geçirmek istediğinizi aşağıdaki ancak bunları birleştirme Expression.Invoke aramalar içine parametrelerini geçirmek açmamı çalıştık ..

Expression<Func<int, bool>> func1 = (x) => x > 5; 
Expression<Func<int, bool>> func2 = (x) => x < 0; 
//Combines the lambdas but result in runtime error saying I need to pass in arguments 
//However I want the argument passed into each child lambda to be whatever is passed into the new main lambda 
Expression<Func<int, bool>> lambda = Expression.Lambda<Func<int, bool>>(Expression.Or(Expression.Invoke(func1), Expression.Invoke(func2))); 

//The 9 should be passed into the new lambda and into both child lambdas 
bool tst = lambda.Compile().Invoke(9); 

İki lambda ifadesinin nasıl birleştirileceği ve çocuk lambdasının argümanlarının ebeveynlere ait olduğuyla ilgili herhangi bir fikir var mı?

+1

"Birleştir" dediğinizde, gerçekte ne olmasını istiyorsunuz? Geçilen argümanın "7" - "func1" ifadesinin doğru olduğunu ve "func2" nin false değerini döndüreceğini varsayalım. Kombinasyonun geri dönmek için ne istiyorsun? –

cevap

18

İfadeleri öğrenmek için bulduğum en iyi yol, PredicateBuilder kaynak koduna bakmaktır. yapabilirsiniz

size ifadeleri birden birleştirmek istediğiniz

:

Expression.Invoke
Expression<Func<int, bool>> func1 = (x) => x > 5; 
Expression<Func<int, bool>> func2 = (x) => x > 10; 

var invocation = Expression.Invoke(func2, func1.Parameters.Cast<Expression>()); 
var expression = Expression.Lambda<Func<int, bool>>(Expression.OrElse(func1.Body, invocation), func1.Parameters); 

sizin func2 parametreleri uygulayan bir InvocationExpression oluşturur.

Aslında, PredicateBuilder ihtiyacınız olan her şey olabilir.

var predicate = PredicateBuilder.False<int>(); 
predicate = predicate.Or(x => x > 5); 
predicate = predicate.Or(x => x > 10); 

ben "x > 5 veya x > 10", Ameliyathaneye garip bir şey gibi görünüyor revize ederim.

Bu yardımcı olur umarım.

+0

Mükemmel, bu sadece aradığım şey. –

+1

'Expression.Lamda' bir 'b' eksik, yani olmalıdır .Expression.Lambda ' – Bern

+2

'Expression.Invoke' bu arada Linq tarafından varlıklar tarafından desteklenmiyor. Yani bu, IL'ye derlenecek olsa da. SQL'e derlenmeyecektir. – Aron

1

Ses ilginç ... Lambda ifadesi hakkında fazla bir şey bilmiyorum, ancak this article'u buldum.

public static Expression<Func<T, bool>> Or<T>(
         this Expression<Func<T, bool>> expr1, 
         Expression<Func<T, bool>> expr2) 
{ 
    var invExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>()); 
    return Expression.Lambda<Func<T, bool>> 
     (Expression.OrElse(expr1.Body, invExpr), expr1.Parameters); 
} 
0

** edit: PredicateBuilder Kaynak Koduya benim için çalışıyor için bir örnektir altında ayy VEYA şeyi dikkatli okudum *** bunu güncellenmiş

Hi,

Sadece bunlardan ayrı olarak aramak isteyip istemediğinizi veya bunları akademik bir bakış açısından birleştirmek istediğinizden emin değilsiniz.

Sadece bu gibi onları arayabilirsiniz:

bool OR(int i1, Func<int, bool> f1, Func<int, bool> f2){ 
    return f1(i1) || f2(i1); 
} 

hile olacaktır That.

ya sen qurious konum

bool MyOR = (i1, f1, f2) => f1(i1) || f2(i1); 

olarak ne zaman, o bir ifade oluşturmak ve şuna bak o yeniden yazabilirsiniz. Eğer ifadenin anatomi bakmak isterseniz yazdığım bu makalede bakabilirsiniz,

Expression<Func<int, Func<int, bool>, Func<int, bool>, bool>> exprOR = 
(i1, f1, f2) => f1(i1) || f2(i1); 

; (elle bunu, yapma yani benim yazım hataları kolay olun, şimdi burada VS var): http://www.codeproject.com/KB/WPF/WpfExpressionTree.aspx

Sadece ifadeyi apadater'e aktarın ve nasıl oluşturulduğunu görün.

Selamlar Gert-Jan

1

Neden sadece yapın:

Func<int, bool> func1 = (x) => x > 5; 
Func<int, bool> func2 = (x) => x > 10; 

List<Func<int, bool>> funcs = new List<Func<int, bool>> { func1, func2 }; 

var value = 7; 

Console.WriteLine(funcs.Any(x => x(value))); // OR 
Console.WriteLine(funcs.All(x => x(value))); // AND 

?

3. taraf kitaplıklarıyla uğraşmaya neden oluyorsunuz.

+0

Sorun şu ki bir ifade ağacında tutmak istiyorum, bu nedenle varlık çerçevesi tarafından ayrıştırılır ... –

+1

Yeterince adil, öneri muhtemelen o zaman geçerli değil –

İlgili konular