2009-04-08 6 views
18

हां मैंने this देखा है लेकिन मुझे अपने विशिष्ट प्रश्न का उत्तर नहीं मिला।Func <T, bool> को <T> पर अनुमानित करने के लिए कैसे परिवर्तित करें?

एक लैम्ब्डा testLambda कि टी लेता है और एक बूलियन रिटर्न

मैं दोनों List.FindIndex (testLambda) का उपयोग करने में सक्षम होना चाहिए (मैं इसे या तो विधेय या समारोह है कि मुझे पर निर्भर है बना सकते हैं) (यह देखते हुए एक अनुमान लेता है) और सूची। जहां (testLambda) (एक Func लेता है)।

कोई विचार दोनों कैसे करना है?

Func<object, bool> testLambda = x=>true; 
int idx = myList.FindIndex(x => testLambda(x)); 

काम करता है, लेकिन ick:

उत्तर

37

आसान:

Func<string,bool> func = x => x.Length > 5; 
Predicate<string> predicate = new Predicate<string>(func); 

मूल रूप से आप किसी भी संगत मौजूदा उदाहरण के साथ एक नया प्रतिनिधि उदाहरण बना सकते हैं। यह भी विचरण (सह और विपरीत) का समर्थन करता है:

Action<object> actOnObject = x => Console.WriteLine(x); 
Action<string> actOnString = new Action<string>(actOnObject); 

Func<string> returnsString =() => "hi"; 
Func<object> returnsObject = new Func<object>(returnsString); 

आप इसे सामान्य बनाना चाहते हैं:

static class ListExtensions 
{ 
    public static int FindIndex<T>(this List<T> list, Func<T, bool> f) { 
    return list.FindIndex(x => f(x)); 
    } 
} 

// ... 
Func<string, bool> f = x=>Something(x); 
MyList.FindIndex(f); 
// ... 

के लिए

static Predicate<T> ConvertToPredicate<T>(Func<T, bool> func) 
{ 
    return new Predicate<T>(func); 
} 
+4

इस तरह के खेल मुझे गुस्से में डालते हैं। मुझे लगता है कि मुझे लगता है कि उन्होंने ऐसा क्यों किया लेकिन अभी भी ... –

+0

वे कम से कम FindIndex –

+0

के लिए एक अधिभार प्रदान कर सकते हैं "किस प्रकार" खेल? आपका क्या अर्थ है? –

7

मैं इस मिला है।

0

ध्वनि एक मामले की तरह मैं प्यार करता हूँ सी # 3 ...

3

मैं खेल के लिए थोड़ा देर हो चुकी हूं, लेकिन मुझे विस्तार विधियां पसंद हैं:

public static class FuncHelper 
{ 
    public static Predicate<T> ToPredicate<T>(this Func<T,bool> f) 
    { 
     return x => f(x); 
    } 
} 

तो फिर तुम इसे पसंद का उपयोग कर सकते हैं:

List<int> list = new List<int> { 1, 3, 4, 5, 7, 9 }; 
Func<int, bool> isEvenFunc = x => x % 2 == 0; 
var index = list.FindIndex(isEvenFunc.ToPredicate()); 

हम्म, मैं अब FindIndex विस्तार विधि देखें। मुझे लगता है कि यह थोड़ा और सामान्य जवाब है। ConvertToPredicate से वास्तव में बहुत अलग नहीं है।

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