2012-01-15 11 views
20

, साक्षात्कारकर्ता क्वेरी निम्नलिखितकैसे लैम्ब्डा अभिव्यक्ति एक साक्षात्कार में काम करता है

int[] array = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
Func<int, int> func = i => 
{ 
    Console.Write(array[i]); 
    return i; 
}; 

var result = array.Where(e => e <= func(2)).ToArray(); 

तो किसी भी एक मुझे मार्गदर्शन करेंगे कैसे e <= func(2) बात काम करता है मुझसे पूछते हैं? और कैसे पिछली पंक्ति i.e

var result = array.Where(e => e <= func(2)).ToArray(); 

काम करता है?

+1

अनुसंधान 'क्लोजर', या संभवतः 'पूर्वानुमान', जहां आपका भ्रम है, इस पर निर्भर करता है। –

+1

आपका भ्रम वास्तव में कहां है? तुम क्या समझते हो – svick

+4

मुझे लगता है कि साक्षात्कारकर्ता आपको दो तीरों के साथ चाल करने की कोशिश कर रहा था। –

उत्तर

7

यह समझना आसान है अगर आप कोष्ठक का उपयोग हो सकता है:

var result = array.Where(e => (e <= func(2))).ToArray(); 

यह

e => ... 

Constructs एक समारोह जो एक तर्क लेता है।

यह

e <= func(2) 

func(2) करने के लिए e तुलना करती है। func(2)2 तर्क के साथ फ़ंक्शन func पर कॉल करता है।

सभी में, <= के पास => से कोई लेना देना नहीं है। वे दो पूरी तरह से अलग ऑपरेटरों हैं। संक्षेप में ... => ... एक समारोह बनाता है। ... <= ... तर्कों की तुलना करता है।

+12

दूसरे शब्दों में, '=>' का एक बुरा अनुमान है "⇒" और '<=' "≤" का एक खराब अनुमान है। –

+0

@lasseespeholt ... thnx .. आपकी प्रतिक्रिया में मेरा जवाब भेजें ... thnx फिर .. – Usman

+0

@ user842218 आपका स्वागत है :) –

2

इसका मतलब सभी e है जहां e छोटा या बराबर है func (2)। LINQ अभिव्यक्ति का मूल्यांकन में ToArray() कॉल परिणाम है, तो 3333333333 कंसोल

+1

'23' के बराबर या उससे कम एक सादा पुराना प्रिंट मुद्रित हो जाता है? मैंने अनुमान लगाया होगा '3333333333' –

+1

func (2) हमेशा सरणी (3) का तीसरा तत्व प्रदर्शित करता है और सरणी में प्रत्येक तत्व के लिए मूल्यांकन किया जाता है, इसलिए, यह 3333333333 – nan

+0

प्रदर्शित करता है मेरे लिए ऐसा लगता है कि परिणाम 1,2, 3 होगा, यह तर्क होगा कि तर्क 2 है। – Tigran

1

Where() पर छपा रहता एक LINQ query कि एक परीक्षण अपने लैम्ब्डा अभिव्यक्ति पैरामीटर में निहित के आधार पर एक सरणी फ़िल्टर करती है।

e => e <= func(2), एक लैम्ब्डा अभिव्यक्ति जो Where() क्वेरी में भेजा जाता है array में हर तत्व लेने के लिए और result है कि तत्व जोड़ यदि मान को ("< =") समारोह से कम या बराबर है करने के लिए है (2) ।

ToArray() एक रूपांतरण ऑपरेटर है जो IENumerable से सरणी तक कास्ट की तरह कार्य करता है।

LINQ पर अधिक के लिए here देखें।

4

Func<int, int> का अर्थ है कि func एक प्रकार का एक प्रकार है जिसमें टाइप int int और प्रकार int का परिणाम होता है। i पैरामीटर है। फ़ंक्शन कंसोल के लिए सरणी तत्व लिखता है और पैरामीटर को अनमोडिफाइड देता है।

Where फ़ंक्शन दिए गए पूर्वानुमान से मेल खाने वाले सभी मामलों को वापस करता है, ToArrayWhere (linq के बारे में पढ़ें) द्वारा वापस आईनेमेरेबल से एक सरणी बनाता है। e => e <= func(2) एक पैरामीटर प्रकार int (संग्रह प्रकार के समान) के साथ एक फ़ंक्शन है, और प्रकार बूल के परिणामस्वरूप। आप एक सामान्य समारोह के रूप में यह लिख सकते हैं:

bool Foo(int e) { 
    return e <= func(2); 
} 

और func के बाद से एक असंशोधित पैरामीटर देता है, यह कार्यात्मक

bool Foo(int e) { 
    return e <= 2; 
} 

लेकिन पक्ष प्रभाव काम कर नहीं के बराबर है।

+0

उत्कृष्ट एवर। मैं जो पोस्ट करने जा रहा था उसके समान! :) – gideon

+0

@Dmitry Polyanitsa ... क्या आप कृपया मुझे बताएंगे कि Func में, कौन सा पैरामीटर बदले में है? और कौन सा इनपुट के लिए है? – Usman

+0

इनपुट के लिए पहला, परिणाम के लिए दूसरा: http://msdn.microsoft.com/en-us/library/bb549151.aspx –

4

आप सी # में = और < या > के संभावित संयोजन को देखें, तो:

  • <= "बराबर या उससे कम" ऑपरेटर
  • >= है "से अधिक या बराबर" ऑपरेटर
  • है
  • => लैम्ब्डा ऑपरेटर है, बाईं ओर लैम्ब्डा के पैरामीटर हैं, दाईं ओर शरीर
  • =< वैल्यू नहीं है आईडी, ऐसा कोई ऑपरेटर
संबंधित मुद्दे