2011-08-21 17 views
13

पर कनवर्ट करें मुझे लगता है कि मेरा दिमाग फनक्स को समझने की कोशिश कर रहा है ... अगर इसका कोई मतलब नहीं है, तो मैं क्षमा चाहता हूं, अभी यह मुझे समझ में आता है लेकिन यह पहले से ही एक लंबा दिन रहा है ....Func <T, String> को Func <T, bool>

1) मान लें कि आप एक समारोह जो टी में ले जाता है और एक स्ट्रिंग आउटपुट दिए गए हैं: (

Func<T, string> 

आप एक समारोह है कि एक टी में ले के रूप में बदल सकते हैं कि और रिटर्न कुछ तर्क के आधार पर एक bool में इस मामले में यदि लौटाई गई स्ट्रिंग खाली है (स्ट्रिंग.इएस नलऑरहाइट स्पेस)?

Func<T, bool> 

2) यदि आप एक ही बात कर सकते हैं अगर आप एक

Expression<Func<T, string>> 

दिया है और यह एक

Func<T, bool> 

पर आधारित है कि यदि लौटे स्ट्रिंग है सही/गलत रिटर्न में बदलने की जरूरत है खाली (स्ट्रिंग.आईएस नलऑरहाइट स्पेस)?

धन्यवाद

उत्तर

11

पहले भाग के लिए आप भी कुछ "उच्च" -order समारोह बना सकते हैं



Func <T,string> test = ... 
var result = MapFun(test, String.IsNullOrWhiteSpace); 

(मुझे आशा है कि सी # प्रकार प्रकार निष्कर्ष यहां काम कर रहा है)

आप समारोह पर विस्तार के रूप में यह निर्धारित करते हैं यह और भी आसान हो जाता है:


public static class FuncExtension 
{ 
    public static Func<A,C> ComposeWith<A,B,C>(this Func<A,B> input, Func<B,C> f) 
    { 
     return a => f(input(a)); 
    } 
} 

यहाँ एक बहुत ही साधारण परीक्षण है:


Func<int, string> test = i => i.ToString(); 
var result = test.ComposeWith(string.IsNullOrEmpty); 

दूसरे के लिए: मुझे लगता है कि आप अभिव्यक्ति को "असली" Func में संकलित कर सकते हैं और फिर उपरोक्त कोड का उपयोग कर सकते हैं। see MSDN Docs on Expression.Compile

पुनश्च: समारोह बेहतर यह इरादा (यह समारोह रचना)

+0

मुझे लगता है कि आपका मतलब है "टाइप करें" और "हस्तक्षेप टाइप करें"; –

+0

धन्यवाद! जवाब देखने के बाद यह पूरी तरह से समझ में आता है। कई सही उत्तर लेकिन आपका पहला और पूरा था इसलिए आपको चेक चेक मिल गया। सभी को धन्यवाद! – Peter

3

तो आपको एक अलग प्रतिनिधि के रूप में इसे परिभाषित नहीं किया जा सका:



Func<A,C> MapFun<A,B,C>(Func<A,B> input, Func<B,C> transf) 
{ 
    return a => transf(input(a)); 
} 

उपयोग:

Func<T, string> func1 = t => t.ToString(); 
Func<T, bool> func2 = t => string.IsNullOrEmpty(func1(t)); 
2

पहले भाग तकनीक समारोह संरचना के रूप में जाना जाता है के लिए यानी आप 2 कार्यों रचना एक नया कार्य बनाने के लिए मैच के लिए नाम दिया। अपने मामले में आप एक समारोह Func<T,String> और एक अन्य समारोह (स्ट्रिंग खाली या शून्य की तरह) प्रकार Func<string,bool> की है जो, का उपयोग करते हुए समारोह रचना आप इन दो कार्यों की रचना कर सकते हैं Func<T,Bool>

सबसे कार्यात्मक प्रोग्रामिंग भाषा प्रकार का एक नया समारोह बनाने के लिए पहले से ही अपनी मानक लाइब्रेरी में या भाषा में परिभाषित फ़ंक्शन की यह रचना है। लेकिन भाषा आपकी भाषा के लिए एक बनाना मुश्किल नहीं है यदि भाषा प्रथम श्रेणी मूल्यों के रूप में कार्यों का समर्थन करती है।

public static Func<X,Z> Compose<X,Y,Z>(Func<X,Y> a, Func<Y,Z> b) 
{ 
    return (v) => b(a(v)); 
} 
2

1 करने के लिए:: (bool और स्ट्रिंग तुम भी parametrize कर सकते हैं) हाँ:

Func<T, bool> Compose<T>(Func<T, string> source, Func<string, bool>map) 
{ 
    return x => map(source(x)); 
} 

करने के लिए 2

सी # में आप नीचे समारोह जो आप कार्यों की रचना करने की अनुमति देगा का उपयोग कर सकते : हां, लेकिन आप पहली अभिव्यक्ति संकलन करने की जरूरत:

Func<T, bool> Compose<T>(Expression<Func<T, string>> source, Func<string, bool> map) 
{ 
    return x => compose(source.Compile(), map) 
} 

.Compile अभिव्यक्ति संकलित कर देगा मैं एक गतिशील सीएलआर विधि के लिए जिसे आप लौटे प्रतिनिधि के साथ बुला सकते हैं।

आप इस तरह इस कोड का उपयोग कर सकते हैं:

Func<int, string> ts = i => i.ToString(); 
var result = Compose(ts, string.IsNullOrEmpty); 

वैसे, इस मामले में आप वास्तव में एक उच्च क्रम समारोह लिखना चाहिए। आप यहां क्या कर रहे हैं (बीजगणित रूप से) मोनोइड्स बना रहा है। function composition याद रखें? f . g := f(g(x)) वह है जो आप यहां कर रहे हैं।

g:A->B और f:B->C के रूप में नक्शे (जहां ए, बी और सी सेट कर रहे हैं) के रूप में स्रोत तो f . g के परिणाम की Think h:A->C है। वैसे, . ऑपरेटर अक्सर कार्यात्मक प्रोग्रामिंग भाषाओं में बना होता है, जैसे कि हास्केल और आपके compose फ़ंक्शन (लेकिन क्लीनर सिंटैक्स के साथ) जैसी ही चीज़ प्राप्त करता है।

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