2010-03-30 7 views
7

मेरे पास LINQ कथन का अनुसरण है और मैं एक्सटेंशन विधियों का उपयोग करके इसे फिर से लिखना चाहता हूं।एक्सटेंशन विधियों का उपयोग करके निम्नलिखित LINQ कथन को फिर से लिखने का शानदार तरीका क्या है?

from x in e 
from y in e 
from z in e 
select new { x, z } 

एक संभव समाधान है:

e.Join(e, x => 42, y => 42, (x, y) => new { x, y }) 
    Join(e, _ => 42, z => 42, (_, z) => new { _.x, z }); 

हालांकि यह सब कुछ लेकिन सुरुचिपूर्ण है।

क्या आपको कोई विचार है कि दूसरी अभिव्यक्ति की सुंदरता में सुधार कैसे करें?

+0

तुम सच में उसी क्रम का उपयोग करते हैं सभी तीनों से 'खंड' में? 'सौंदर्य' टैग के लिए –

+2

+1 :-) –

+0

@ जोन स्कीट: हाँ यह इरादा है। यह विशेष उदाहरण एरिक मेयर्स चैनल 9 वीडियो व्याख्यान से कार्यात्मक प्रोग्रामिंग के बारे में आता है। http://channel9.msdn.com/tags/Functional+Programming/ –

उत्तर

6
e.SelectMany(x => e.SelectMany(y => e.Select(z => new { x, z }))) 
6

Join का उपयोग गलत दृष्टिकोण आईएमओ है।

इस बात का प्रत्यक्ष समकक्ष (मुझे लगता है कि!) किया जाता है:

e.SelectMany(x => e.SelectMany(y => e.Select(new { y, z }), 
      (x, yz) => new { x, yz.z })) 

हालांकि मैं लगता यह बराबर होगा:

e.SelectMany(x => e.SelectMany(y => e.Select(new { x, z }))) 
+0

सौंदर्य 'भावना' की भावना में स्पष्ट रूप से गलत दृष्टिकोण है। शुद्धता संबंधपरक बीजगणित (एसक्यूएल) अंतर्ज्ञान के अर्थ में मुझे बताता है कि यह ठीक होना चाहिए। –

+0

@ जकूब: यह काम कर सकता है, लेकिन इससे यह सही दृष्टिकोण नहीं बनता है। एक क्रॉस-जॉइन के समकक्ष LINQ समतुल्य (यानी जहां कोई "कुंजी" नहीं है) 'जॉइन' नहीं है, यह 'SelectMany' है) - भले ही' SelectMany' स्वयं इससे अधिक कार्यक्षमता प्रदान करता हो। –

+0

क्या ये प्रत्येक एक पेरेथेसिस गायब हैं? –

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