2012-01-15 12 views
29

का उपयोग कर मैं नीचे LINQ में Single उपयोग नहीं कर रहा बिना LINQ में कोई तत्व अपवाद होता है, लेकिन मैं अभी भी हो रही है एक अपवाद 'अनुक्रम कोई तत्व शामिल हैं':अनुक्रम भी एकल

allNames = StockCollection.Where((s) => s.Name.IndexOf("A") == 0) 
          .Select((s) => s.Name) 
          .Aggregate((namesInfo, name) => namesInfo += ", " + name); 

यह अपवाद आता है जब 'A' नाम से शुरू होने वाला कोई स्टॉक नहीं।

ऐसा लगता है कि एक विस्तार विधि कम से कम एक तत्व को संतुष्ट करने की अपेक्षा कर रही है लेकिन इसकी उम्मीद नहीं है।

क्या आप इसे हल करने के लिए सबसे अच्छा समाधान सुझा सकते हैं?

अग्रिम धन्यवाद।

उत्तर

56

के रूप में डेनिस Traub ने कहा है, Aggregate आप उपयोग कर रहे हैं अधिभार कि अपवाद फेंकता है जब स्रोत अनुक्रम खाली है।

स्पष्ट ठीक उपयोग करने के लिए other overload of Aggregate that accepts an initial seed (आप string.Empty चाहते हैं), लेकिन यह है कि परिणाम आप से छुटकारा पाने के करना होगा, जिसमें एक प्रमुख अल्पविराम में परिणाम होगा है।

: किसी भी मामले में (संपादित। आप .DefaultIfEmpty(string.Empty) अपने मौजूदा Aggregate अधिभार के बाद के साथ इस चकमा कर सकते हैं यह एक प्रमुख अल्पविराम का उत्पादन नहीं होता।)

, Aggregate उस तरह का उपयोग कर तार शामिल होने के लिए नहीं है एक अच्छा विचार (Schlemiel the Painter's algorithm पैदा करता है)। यहां बताया गया है कि मैं क्वेरी कैसे लिखूंगा:

allNames = string.Join(",", StockCollection.Select(s => s.Name) 
              .Where(name => name.StartsWith("A")); 

.NET 3.5 में, आपको एक की आवश्यकता होगी। ToArray()Where को एक सरणी में भौतिक बनाने के लिए।

+0

धन्यवाद उत्तर के लिए एक बहुत मैं अब यह कोशिश करने जा रहा हूँ .. लेकिन फिर भी मैं जानना चाहता है कि कुल एक अपवाद फेंक रहा है चाहता हूँ। –

+0

@ डी जे: क्यों? यह समझदार मूल्य क्या वापस आ सकता है? शायद रिटर्न प्रकार का डिफ़ॉल्ट मान (इस मामले में 'शून्य'), लेकिन मुझे वह नहीं चाहिए। – Ani

+1

समस्या यह है कि हम रनटाइम पर नहीं जानते कि हमारे संग्रह में कोई ऑब्जेक्ट होगा या नहीं? इसलिए इसे अपवाद नहीं फेंकना चाहिए या यह सिर्फ डिफ़ॉल्ट मान वापस कर सकता है। 'DefaultIfEmpty' के लिए –

8

खाली बीज के साथ उपयोग करें।

new string[]{}.Aggregate("", (a,b)=> a+b) 
संबंधित मुद्दे