2013-10-11 14 views
16

SelectMany एक वस्तु पेड़ पार होगा:LINQ SelectMany बांध है?

class Agency { List<Employees> Staff } 

IEnumerable<Agency> Agencies 

IEnumerable<Employee> = 
from anAgency in Agencies 
from anEmployee in anAgency.Staff. 
select anEmployee;  

आमतौर पर, मैं हमेशा एक एजेंसी पहले लेने होता है, और स्टाफ के आंतरिक उदाहरण का उपयोग कर्मचारियों को पाने के लिए। लेकिन सरकार के शटडाउन के मामले में, मैं सिर्फ यह देखने के लिए हर कोई सूचीबद्ध करना चाहता हूं कि कौन कवर कर सकता है।

इस दुर्लभ मामले में जो मेरे ऑब्जेक्ट मॉडल के लिए अनुचित है, मैं मनमाने ढंग से पेड़ को पार करने के लिए SelectMany का उपयोग कर सकता हूं।

आप इस ट्रैवर्सल को क्या कहते हैं? एक क्रॉस शामिल हो? ऐसा इसलिए नहीं है क्योंकि एजेंसी ऑब्जेक्ट में कर्मचारी की संरचना में शामिल होना पहले से ही अंतर्निहित है।

क्या यह बांधता है? मुझे बांधने के बारे में कुछ नहीं पता।

क्या यह से कोई अन्य नाम नहीं है, कई?

+0

SelectMany नक्शा है। http://stackoverflow.com/questions/6820866/what-function-acts-as-selectmany-in-jquery –

+3

चयन करें कई बाध्य करने के लिए isomorphic है। ' SelectMany का पहला हस्ताक्षर मोनैडिक "बाइंड" ऑपरेटर के लिए isomorphic है, लिखा है = = हास्केल में। इसमें शामिल एक कारण है कि मोनैड के अच्छी तरह से स्थापित ढांचे पर LINQ की नींव को दृढ़ करना है। वह नींव LINQ polymorphically composable राज्य प्रचार, अपवाद, निरंतरता, विकल्प, आदि जैसे सभी प्रकार की चीजों के लिए लागू करता है .: सभी monads। ' http://stackoverflow.com/questions/422958/how-c-sharp-compiler-choose-selectmany-when-translating-linq-expression –

+1

एक सहसंबंधित शामिल हों। एसक्यूएल सर्वर में यह एक 'क्रॉस आवेदन' होगा। – usr

उत्तर

38

SelectMany सी # में हास्केल (>>=) या flatMap में बाला से मेल खाता है। हास्केल में >>= के हस्ताक्षर है:

(>>=) :: Monad m => m a -> (a -> m b) -> m b 

तो बाँध एक-दूसरे monadic मूल्य का निर्माण करने के लिए इस्तेमाल एक ऑपरेशन है।

ऊपर हस्ताक्षर में सी # m के मामले में IEnumerable, IObservable, IQueryable आदि IEnumerable के लिए, SelectMany इसलिए

IEnumerable<A> -> (A -> IEnumerable<B>) -> IEnumerable<B> 

है या में सी #

public static IEnumerable<B> SelectMany<A, B>(this IEnumerable<A> first, Func<A, IEnumerable<B>> selector) 

बाँध का अर्थ निर्भर करता है मोनैड प्रकार पर, आईनेमरेबल के लिए, इनपुट अनुक्रम में प्रत्येक तत्व का उपयोग एक नया अनुक्रम बनाने के लिए किया जाता है, और अनुक्रमों के परिणामी अनुक्रम पीआर को चपटा जाता है आउटपुट अनुक्रम oduce।

बांध का एक और सूत्र है जो इसे और अधिक स्पष्ट कर सकता है। जबकि मोनैड को अक्सर बाइंड के कार्यान्वयन के संदर्भ में वर्णित किया जाता है, मोनैड को दो अन्य परिचालनों का समर्थन करना चाहिए, map और join

map में सी # का चयन से मेल खाती है और लगता है कि:

map :: Monad m => (a -> b) -> (ma -> m b) 

तो यह एक 'संरचना संरक्षण' एक monadic मूल्य से अधिक एक नियमित रूप से समारोह उठाने का तरीका है।

join प्रकार

join :: Monad m => m m a -> m a 

इसलिए शामिल होने नेस्टेड monadic मूल्यों समतल करने के लिए इस्तेमाल किया जाता है।सी # में इस तरह

public static IEnumerable<A> Join<A>(this IEnumerable<IEnumerable<A>> nested) 

bind नक्शे के मामले में लागू किया जा सकता देखने के लिए और शामिल होने के रूप में

m >>= f = join (map f m) 

तो मूल सवाल का जवाब देने हैं, SelectMany अन्य भाषाओं में bind या flatMap से मेल खाती है। बाइंड सिर्फ फ्लैटनिंग नहीं कर रहा है, लेकिन इसे नेस्टेड मोनैडिक वैल्यू (जैसे IEnumerable<T> के मामले में अनुक्रम) के प्रवाह के बाद एक परिवर्तन के रूप में देखा जा सकता है। joinIEnumerable<T> के लिए मौजूदा linq एक्सटेंशन में मौजूद नहीं है।

+0

वाह। मुझे समझ में नहीं आता कि यहां क्या हो रहा है, लेकिन हास्केल अवधारणाओं के साथ आईनेमेरेबल विलय करने वाले आपके उदाहरण मुझे यह विचार दे रहे हैं कि मैं इसे समझ सकता हूं। उत्कृष्ट उपचार धन्यवाद। –

4

.NET दुनिया से बाहर इसे अक्सर "फ़्लैटनिंग" कहा जाता है, अगर आप यही पूछ रहे हैं। यह एक द्वि-आयामी परिणाम को एक आयाम में सेट करता है।

+0

केवल दो आयाम? कोई चयन नहीं एक तीन स्तर के गहरे पेड़ को पार करेगा। –

+0

क्या यह बांधता है? बांधने वाला बांध है? –

+0

नहीं, उपरोक्त आपकी टिप्पणियों में संदर्भित "बाध्य" वह है जो लिंक कथन को एक साथ बंधे जाने में सक्षम बनाता है। SelectMany परिणाम के एक संख्यात्मक रिटर्न देता है जो अगले जंजीर बयान (अगला कथन परिणाम परिणामों की संख्या पर कार्य करता है) के लिए बाध्य हो जाता है, अगला कथन दूसरे परिणाम को देता है जो तीसरे कथन आदि से बंधे होते हैं – Dan

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