2008-10-10 7 views
11

मान लें कि मेरी ऑब्जेक्ट सही कार्य क्रम में हैं (यानी टीडीडी मुझे लगता है कि वे काम करते हैं)।स्थानीय चर के बिना प्रोग्रामिक रूप से LINQ क्वेरी का निर्माण करना मुझे

मैं एक है कि मैं (ठीक से इंडेंट को छोड़कर) इस प्रकार बना सूची है:

var result = from v in vendors 
      from p in v.Products 
      orderby p.Name 
      select p; 

यह काम करता है - मैं सभी विक्रेताओं से सभी उत्पादों मिलता है।

अब मेरे पास उपयोगकर्ता द्वारा रनटाइम पर बनाए गए स्थितियों की एक सूची है। आइए उन्हें लागू करें:

foreach (Attribute a in requiredAttributes) 
{ 
    result = result.Where(p => p.Attributes.Contains(a)); 
} 

यह आदिम हो सकता है, लेकिन मैंने सोचा कि यह काम करेगा। हालांकि, इस फोरैच लूप के समाप्त होने के बाद, जब आप "परिणाम" की गणना करते हैं तो इसमें उन सभी उत्पादों को शामिल किया जाएगा जिनमें आवश्यक गुणों की अंतिम विशेषता है, इसकी विशेषता गुण (संग्रह भी) में।

मेरे लिए, यह "ए" की तरह बदबू आ रही है, प्रत्येक यात्रा के साथ लूप को कहीं भी ओवरराइट किया जाता है, और केवल अंतिम ही लागू होता है।

किसी भी तरह से IENumerable को एक एक्सटेंशन विधि लिखने के लिए संक्षिप्त कहा जाता है जिसे ContainsAll (IEnumerable) या उस प्रभाव से कुछ कहा जाता है, मैं जो चाहता हूं उसे प्राप्त कैसे कर सकता हूं, जो मूल रूप से एक तार्किक है और मुझे केवल उन उत्पादों को दे रहा है जिनमें सभी आवश्यक गुण हैं ?

+0

धन्यवाद दोस्तों - मैं जॉन को "स्वीकृत उत्तर" दे रहा हूं क्योंकि ऐसा लगता है कि यह "सामान्य" मामले के लिए अधिक उपयुक्त हो सकता है। लेकिन मैं निश्चित रूप से ओमर के सुझाव की भी जांच करूँगा, आपको नहीं पता था कि आप ऐसा कर सकते हैं। सभी को वोट। :) –

+0

इस समस्या को ठीक करने का नया तरीका केवल सी # 5 का उपयोग करना है। यह भी देखें [क्या सी # 5 में चर के चर का उपयोग बदल दिया गया है?] (Http://stackoverflow.com/a/12112959/18192) – Brian

उत्तर

19

(स्पष्टता के लिए संपादित।)

समस्या foreach पाश है, और तथ्य यह है कि "एक" चर पर कब्जा कर लिया जा रहा है और उसके बाद हर बार बदल दिया है। यहां एक संशोधन है जो लूप के प्रत्येक पुनरावृत्ति के लिए प्रभावी रूप से "नया" चर लागू करके और उस नए चर को कैप्चर करने के द्वारा काम करेगा। के लिए नीचे स्क्रॉल - वहाँ this closures article में इस मुद्दे के बारे में अधिक है:

foreach (Attribute a in requiredAttributes) 
{ 
    Attribute copy = a; 
    result = result.Where(p => p.Attributes.Contains(copy)); 
} 

ओमर का समाधान अगर आप इसका इस्तेमाल कर सकते हैं, लेकिन अगर अपने वास्तविक कोड वास्तव में और अधिक जटिल :)

संपादित है इस मदद मिल सकती है एक क्लीनर एक है "कैप्चरिंग रणनीतियों की तुलना: जटिलता बनाम शक्ति"।

+0

मैंने इस बारे में रेसर्पर की परेशान चेतावनियों से इस महत्वपूर्ण बारीकियों को सीखा;) – Grank

7
var result = from v in vendors 
      from p in v.Products 
      where requiredAttributes.All(a => p.Attributes.Contains(a)) 
      orderby p.Name 
      select p; 

एचटीएच।

5

मैं इसे से कोड नहीं है, लेकिन बदलने

foreach (Attribute a in requiredAttributes){  
    result = result.Where(p => p.Attributes.Contains(a)); 
} 

foreach (Attribute a in requiredAttributes){  
    Attribute b = a; 
    result = result.Where(p => p.Attributes.Contains(b)); 
} 

को यह भी ठीक करना चाहिए, मुझे लगता है।

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

  • कोई संबंधित समस्या नहीं^_^