2009-10-22 30 views

उत्तर

3

ईमानदारी से, यह मुझे स्पष्ट रूप से स्पष्ट दिखता है। मुझे लगता है कि इस मामले में एक लैम्ब्डा कम पठनीय हो सकता है, यानी, ब्रैंडन जैसे कुछ नीचे पोस्ट किया गया है।

(ब्रैंडन की पोस्ट से चोरी)

var project = accounts.Select(a => a.AccountProjects) 
         .Where(x => x.AccountProjectID == accountProjectId); 

जहां तक ​​पठनीयता का संबंध है, मुझे लगता है कि छोरों की एक जोड़ी लैम्ब्डा समाधान के लिए बेहतर है, और मुझे लगता है कि अपने समाधान छोरों बेहतर है।

+4

यह इस बात पर निर्भर करता है कि आप इसे कैसे लिखते हैं- "कहीं भी" से पहले एक लाइन ब्रेक जोड़ें और अचानक लैम्ब्डा वास्तव में बहुत पठनीय है। –

+1

मैं एड के साथ सहमत हूं। अब आपके पास क्या है पूरी तरह से पठनीय है, एक लैम्ब्डा वास्तव में कुछ भी सरल नहीं करता है। यदि कुछ भी हो तो यह शायद वरीयता का मामला होगा। – Brandon

+1

लाइन ब्रेक के साथ भी, मेरे लिए यह अभी भी कम पठनीय है, लेकिन मुझे लगता है कि यह एक व्यक्तिपरक चीज है। मुझे लगता है कि बिंदु है; यह पूरी तरह से स्पष्ट है, एक असली समस्या पर ले जाएँ! :) –

4
var project = accounts.SelectMany(a => a.AccountProjects) 
         .Where(x => x.AccountProjectID == accountProjectId); 

चाहे यह वास्तव में आसान है स्वाद का विषय है।

+0

मुझे लगता है कि क्लॉज से कई अलग-अलग-फ़्लैटनिंग SelectMany की तुलना में अवधारणात्मक रूप से सरल हैं, लेकिन इस पर ध्यान दिए बिना, LINQ वाक्यविन्यास का पूरा बिंदु इन जंजीर तरीकों से क्लीनर सिंटैक्स देने के लिए नहीं है? – Joren

+0

दो दृष्टिकोण अवधारणात्मक रूप से समकक्ष हैं। वे वही काम करते हैं। वे संचालन के सटीक उसी सेट को व्यक्त करने के दो अलग-अलग तरीके हैं। जैसा कि मैंने अपने जवाब में उल्लेख किया है, जिसे आप "क्लीनर" या "सरल" पाते हैं, स्वाद का विषय है। – Mark

2

मैं एड स्वंगरेन से सहमत हूं। यह संक्षेप में पर्याप्त और पठनीय दिखता है।

वास्तव में अपने प्रश्न का उत्तर 3 बातों पर निर्भर करता:

  1. आप क्या हासिल करना चाहते हैं - बेहतर पठनीयता? बेहतर प्रदर्शन? आदि
  2. 'खातों' का प्रकार
  3. परिणामस्वरूप संग्रह का उपयोग कैसे किया जा रहा है।

यदि आप बेहतर प्रदर्शन चाहते हैं, और यदि 'खातों' एक सूची है, और परिणामस्वरूप संग्रह को कोड की इन पंक्तियों के तुरंत बाद पुन: सक्रिय करने के लिए पुनरावृत्त किया जाएगा या किसी अन्य विधि को पारित किया जाएगा, तो मैं ऐसा कुछ करूंगा :

List<Account> filteredAccounts = new List<Account>(); 
accounts.ForEach(a => { if (a.AccountProjectID == accountProjectId) filteredAccounts.Add(a); }); 

निश्चित रूप से यह कम पठनीय फिर अपने LINQ बयान है, लेकिन मैं इन 2 लाइनों बल्कि accounts.Select से

का प्रयोग करेंगे ....... और यह निश्चित रूप से बेहतर प्रदर्शन के लिए अनुकूलित है, जो मुझे विश्वास है हमेशा महत्वपूर्ण है।

+2

LINQ क्वेरी पर 'ToList()' को कॉल करने पर इसका क्या फायदा है? –

+0

प्रश्न ने आपको इसे अनुकूलित करने के लिए नहीं कहा था, यह आपको इसे सरल बनाने के लिए कहा था। जब आप कहते हैं कि यह "प्रदर्शन के लिए बेहतर अनुकूलित" है, तो आप भी एक बहुत बड़ी धारणा बना रहे हैं। क्या आपने वास्तव में इसका परीक्षण किया है? क्या आपके पास अपनी धारणा का बैक अप लेने के लिए डेटा है? – Mark

+0

1. जिसे आप सरलीकरण कहते हैं - स्वाद का विषय है। मुझे लगता है कि मैंने अपने पिछले पोस्ट में इस सवाल का जवाब दिया था। 2. बेशक मैंने इसका परीक्षण किया। अन्यथा मैं इसे पोस्ट नहीं करूंगा। समस्या क्वेरी में ToList को कॉल करने में नहीं है। औसत LINQ से ऑब्जेक्ट्स परंपरागत तकनीकों की तुलना में दोगुनी से अधिक धीरे-धीरे (उदाहरण के लिए फ़ोरैच चक्र का उपयोग करके पुनरावृत्ति)। मेरा विश्वास मत करो? आप आसानी से इसे Google के बाहर आसानी से माइक्रो-बेंचमार्क कर सकते हैं। और लैम्ब्डा अभिव्यक्ति के साथ यहां उपयोग की जाने वाली प्रत्येक एक्सटेंशन विधि के लिए फ़ोरैच चक्र से भी बेहतर प्रदर्शन प्रदान करता है। मैंने चीजों की लागत का अध्ययन करने में काफी प्रयास किया, मुझे विश्वास है कि – Alexander

0
accounts 
    .SelectMany (
     a => AccountProjects, 
     (a, ct) => 
     new 
     { 
      a = a, 
      ap = ap 
     } 
    ) 
    .Where (t => (t.ap.AccountProjectID == t.a.accountProjectId)) 
    .Select (t => t.ap) 
संबंधित मुद्दे