2012-01-30 15 views
14

मैं एक पैरामीटर के रूप लैम्ब्डा क्वेरी पारित करने के लिए की जरूरत है, निम्नलिखित कोड नमूना है और मैं एक के लिए यह लागू खोजने के लिए दिलचस्प हूँ, वहाँ के नमूने है: इस तरह की कुछ बात:क्या लैम्ब्डा अभिव्यक्ति को चर या तर्क के रूप में पास करने का कोई तरीका है?

var expr1 = Where(n => n > 6).OrderBy(n => n % 2 == 0).Select(n => n); 
var expr2 = TakeWhile((n, index) => n >= index)); 

और इस तरह इसका इस्तेमाल :

public void UseLambda<T> (IEnumerable<T> source , lambda Expr){ 

var items= Expr.Compile(source); 

foreach(var item in items) 
    Console.Writeline(item.ToString()); 
} 

public void Main(){ 
    List<int> numbers = new List<int> { 10, 24, 9, 87, 193, 12, 7, 2, -45, -2, 9 }; 
    var expr1 = Where(n => n > 6).OrderBy(n => n % 2 == 0).Select(n => n); 
    UseLambda(numbers, expr1); 
} 

क्या किसी के बारे में कोई विचार है?

उत्तर

8

, तो आप इस तरह अपने LINQ भाव निर्धारित किए हैं:

Func<IEnumerable<int>, IEnumerable<int>> expr1 = 
       l => l.Where(n => n > 6).OrderBy(n => n % 2 == 0).Select(n => n); 

Func<IEnumerable<int>, IEnumerable<int>> expr2 = 
       l => l.TakeWhile((n, index) => n >= index); 

और के रूप में अपने UseLambda विधि:

public void UseLambda<T> (IEnumerable<T> source 
          ,Func<IEnumerable<T>, IEnumerable<T>> lambda) 
{ 
    var items= lambda(source); 

    foreach(var item in items) 
     Console.Writeline(item.ToString()); 
    } 
} 

तो फिर तुम मुझे लगता है कि आप के लिए क्या देख रहे हैं।

+2

में कोई त्रुटि है परिभाषित expr1, expr2: 'System.Collections.IEnumerable' और कोई विस्तार विधि 'कहाँ' प्रकार का एक पहला तर्क को स्वीकार करने 'कहाँ' 'System.Collections के लिए एक परिभाषा शामिल नहीं है। IENumerable 'पाया जा सकता है (क्या आप एक प्रयोग निर्देश या असेंबली संदर्भ खो रहे हैं?) – Saeid

+2

में परिवर्तन की आवश्यकता है: Func , ...... – Saeid

+0

संपादन सैयद के लिए धन्यवाद। – Samuel

0

ठीक है, एक लैम्ब्डा लेकिन एक प्रतिनिधि कुछ भी नहीं है, तो आप इस तरह की एक विधि हो सकता है:

public void DoIt(IEnumerable a, Action<IEnumerable> performThis) 
{ 
    performThis(a); 
} 

लेकिन जहां यह में भावना है? अपनी लैम्ब्डा को लागू करने वाली विधि को कॉल करने के बजाय, इसे अपने कोड की अंतिम पंक्तियों में सीधे क्यों न करें?

8

चेक Func(Of T, TResult) Delegate (MSDN)

using System; 

public class LambdaExpression 
{ 
    public static void Main() 
    { 
     Func<string, string> convert = s => s.ToUpper(); 

     string name = "Dakota"; 
     Console.WriteLine(convert(name)); 
    } 
} 

MSDN

एक लैम्ब्डा अभिव्यक्ति के अंतर्निहित प्रकार से सामान्य समारोह प्रतिनिधियों में से एक है। यह को एक लैम्ब्डा अभिव्यक्ति को पैरामीटर के रूप में स्पष्ट रूप से असाइन किए बिना किसी प्रतिनिधि को पर असाइन करने के लिए संभव बनाता है। विशेष रूप से, क्योंकि सिस्टम में कई प्रकार के तरीके हैं। लिंक्स नेमस्पेस में फ़नक (टी, ट्रेशल्ट) पैरामीटर हैं, आप फ़ंक (टी, ट्रेशल्ट) प्रतिनिधि को स्पष्ट रूप से तत्काल बिना किसी लैम्बडा अभिव्यक्ति को पास कर सकते हैं।

संपादित

अपने मामले के लिए

संभव समाधान

static void Main(string[] args) 
{ 
    List<int> numbers = new List<int> { 10, 24, 9, 87, 193, 12, 7, 2, -45, -2, 9 }; 
    Func<IEnumerable<int>, IEnumerable<int>> expr = n => n.Where(n1 => n1 > 6).OrderBy(n1 => n1 % 2 == 0).Select(n1 => n1); 
    UseLambda<int>(numbers, expr); 
} 
private static void UseLambda<T>(List<T> numbers, 
           Func<IEnumerable<T>, 
           IEnumerable<T>> expr) 
{ 
    var values = expr(numbers); 
    foreach (var item in values) { 
     Console.WriteLine(item); 
    } 
} 
1

आप कुछ इस तरह का मतलब यह कार्य करें:

public void UseLambda<T> (IEnumerable<T> source , Func<T, bool> where, Func<T, bool> order) 
{ 
    if(source != null) 
    { 
     IOrderedEnumerable<T> orderBy = source.Where(where).OrderBy(order); 
     foreach (T value in orderBy) 
     { 
      Console.WriteLine(value); 
     } 
    } 
} 

ताकि आप यह इतना की तरह कह सकते हैं:

UseLambda(numbers, x => x > 6, x => x % 2 == 0); 
0
public void UseLambda<T>(IEnumerable<T> source, Expression<Func<IEnumerable<T>, IEnumerable<T>>> expr) 
{ 
    var items = expr.Compile(); 

    foreach (var item in items.Invoke(source)) 
    { 
     Console.WriteLine(item.ToString()); 
    } 
} 


public void Main() 
{ 
    Expression<Func<IEnumerable<int>, IEnumerable<int>>> expr = s => s.Where(n => n > 6).OrderBy(n => n % 2 == 0).Select(n => n); 
    var list = new List<int> { 10, 24, 9, 87, 193, 12, 7, 2, -45, -2, 9 }; 

    UseLambda(list, expr); 
} 
संबंधित मुद्दे

 संबंधित मुद्दे