2012-02-02 19 views

उत्तर

39

अपने भविष्य के संदर्भ के लिए, इस फ़ॉर्म के सभी प्रश्नों को सी # विनिर्देश के सेक्शन 7.16 द्वारा उत्तर दिया गया है।

आपका विशिष्ट प्रश्न इस पैरा द्वारा उत्तर दिया जाता है:


एक दूसरे from खंड एक select खंड

from x1 in e1 
from x2 in e2 
select v 

के बाद की एक जिज्ञासा अभिव्यक्ति

(e1) . SelectMany(x1 => e2 , (x1 , x2) => v) 

में अनुवादित किया गया

तो आपकी क्वेरी:

var query = from a in sequenceA    
      from b in sequenceB 
      select ...; 

रूप

var query = (sequenceA) . SelectMany(a => sequenceB , (a , b) => ...) 

(नोट ज़ाहिर है कि इस कहना मानता है कि "..." एक अभिव्यक्ति है, और नहीं, एक अभिव्यक्ति का पालन किया ही है एक प्रश्न निरंतरता से।)

HDV के जवाब बताते हैं कि

var query = (sequenceA) . SelectMany( 
    a => (sequenceB) . Select(b => ...)); 

भी तार्किक रूप से मान्य अनुवाद होगा, हालांकि यह वास्तव में अनुवाद नहीं है। LINQ कार्यान्वयन के प्रारंभिक दिनों में, यह वह अनुवाद था जिसे हमने चुना था। हालांकि, जैसा कि आप from खंडों पर ढेर करते हैं, यह लैम्ब्स घोंसला को अधिक से अधिक गहराई से बनाता है, जो कि विशाल समस्या प्रकार में समस्या के साथ कंपाइलर प्रस्तुत करता है। अनुवाद wrecks संकलक प्रदर्शन की यह पसंद, इसलिए हमने पारदर्शी पहचानकर्ता तंत्र पेश किया ताकि हमें गहरा घोंसला वाले क्षेत्रों के सीमेंटिक्स का प्रतिनिधित्व करने के लिए एक बहुत सस्ता तरीका मिल सके।

तो इन विषयों में आपकी रुचि है:

क्यों गहरा नीडिंत lambdas हल करने के लिए संकलक के लिए एक कठिन समस्या पेश के बारे में अधिक विचार के लिए देखें:

http://blogs.msdn.com/b/ericlippert/archive/2007/03/26/lambda-expressions-vs-anonymous-methods-part-four.aspx

http://blogs.msdn.com/b/ericlippert/archive/2007/03/28/lambda-expressions-vs-anonymous-methods-part-five.aspx

अधिक जानकारी के लिए पारदर्शी पहचानकर्ताओं के बारे में जानकारी, इस पोस्ट को वेस डायर से देखें, जिन्होंने उन्हें सी # 3 में लागू किया था।0:

http://blogs.msdn.com/b/wesdyer/archive/2006/12/22/transparent-identifiers.aspx

और उनके बारे में लेख की मेरी श्रृंखला:

http://ericlippert.com/2014/07/31/transparent-identifiers-part-one/

+3

ध्यान दें कि "सी # भाषा विशिष्टता" एक डाउनलोड करने योग्य वर्ड दस्तावेज़ है और इसलिए अधिकांश खोज इंजनों द्वारा अनुक्रमित नहीं किया गया है और ऑनलाइन पढ़ने योग्य नहीं है। शायद माइक्रोसॉफ्ट भविष्य में इसे बदल सकता है! –

9
var query = sequenceA.SelectMany(a => sequenceB.Select(b => ...)); 

संपादित: के रूप में टिप्पणी में एरिक Lippert द्वारा कहे अनुसार, इस एक ही परिणाम देता है, लेकिन जानबूझकर यह कैसे नहीं आंतरिक रूप से अनुवाद किया है है। SelectMany पर कॉल करने के लिए किसी अन्य तरीके के लिए उसका उत्तर देखें, जो मूल के अनुरूप है। इसके अलावा, स्पष्टता के लिए छोड़े गए b => को जोड़ा गया।

+0

चाहेंगे 'वर की तरह एक गैर नेस्टेड संस्करण क्वेरी = अनुक्रम ए। चयन करें (ए => अनुक्रम बी)। चयन करें (...); 'भी काम करते हैं? –

+0

@ OlivierJacot-Descombes यह भी संभव है, लेकिन इसका मतलब है कि आप दूसरे 'चयन' पैरामीटर के भीतर से' ए 'का उल्लेख नहीं कर सकते हैं। – hvd

+0

@hdv: आप में से कोई भी सही नहीं है। आपको यह इंगित करने का अधिकार है कि ओलिवियर की टिप्पणी में, उन्होंने रेंज वैरिएबल 'ए' खो दिया है। लेकिन आपके दोनों अनुवादों में आप दोनों ने श्रेणी परिवर्तनीय 'बी' खो दिया है। आपके अनुवाद में 'बी' कहां गया? क्या होगा यदि '...' 'बी' को संदर्भित करता है? आपको वहां कहीं और लैम्ब्डा चाहिए! –

1

एक और तरीका है लिखने के लिए यह होगा:

var query = a.Join(b, i => new { }, j => new { }, (i, j) => new { i = i, j = j }); 
+0

ने 'स्टेटस' से 'नेस्टेड' और 'SelectMany' दोनों को नेस्टेड एन्युमेडेशन फ़्लैट किया। अर्थात। वे समीकरणों की गणना को एक समतल गणना में परिवर्तित करते हैं जिसमें स्रोत के घोंसले के समीकरणों के सभी तत्व होते हैं। वे दो असंबंधित गणनाओं में शामिल नहीं होते हैं। –

+0

मैंने जो किया वह क्रॉस-जॉइन है, जैसा कि आपने सूचीबद्ध अन्य विकल्पों के समान किया है। परिणाम गणना भी फ्लैट है। आगे बढिए और इसे आजमाइए :) । –

+0

उदाहरण: इनपुट 'स्ट्रिंग [] [] नेस्टेड = नई स्ट्रिंग [] [] { \t नई स्ट्रिंग [] {"ए", "बी", "सी"}, \t नई स्ट्रिंग [] {"एए", "बीबी", "सीसी", "डीडी"}, \t नई स्ट्रिंग [] {"1", "2", "3"}, }; '। अपेक्षित आउटपुट: '" ए "," बी "," सी "," एए "," बीबी "," सीसी "," डीडी "," 1 "," 2 "," 3 "' –

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