दिलचस्प पोस्ट
क्यों नहीं PyCharm के स्वत: पूर्ण पुस्तकालयों मैं स्थापित करने के लिए काम कर रहा है? आप जंग में एक सुरक्षित स्थिर सिंगलटन कैसे बना सकते हैं? Socket.IO 1.x और Express 4.x के साथ सत्र कैसे साझा करें? एंड्रॉइड पर एक स्ट्रिंग को एक पूर्णांक में कनवर्ट करना एक गतिशील आवंटित सरणी के साथ sizeof का उपयोग करना मैं google-apps-script में एक एकल पृष्ठ टेम्पलेट से बहुपृष्ठ पाठ दस्तावेज़ कैसे बना सकता हूं? फैंसीबॉक्स लिंक लाइटबॉक्स में नहीं दिखता – मैं क्या याद कर रहा हूं? अजगर में तैरने की आसान सुंदर प्रिंटिंग? मैं व्हाइटस्पेस कैसे ट्रिम कर सकता हूँ? एंड्रॉइड – केवल शीर्ष पर गोलाकार कोनों के साथ चित्रकारी लाइब्रेरी फ़ंक्शन, फ़ंक्शन को स्वयं के साथ एन बार लिखने के लिए JSON को पायथन सीएसवी AsyncTask, यह इस तरह के एक प्रदर्शन जुर्माना मारा जाना चाहिए …? एंड्रॉइड में ऐरे एडाप्टर का उपयोग करके कस्टम फ़िल्टरिंग जब तक उपयोगकर्ता स्क्रॉल नहीं करते, तो अतिप्रवाह डिवा को नीचे तक स्क्रॉल रखें

लिनक: समूहबी, सम और गणना

मेरे पास उत्पादों का संग्रह है

public class Product { public Product() { } public string ProductCode {get; set;} public decimal Price {get; set; } public string Name {get; set;} } 

अब मैं उत्पाद कोड के आधार पर संग्रह को समूह करना चाहता हूं और प्रत्येक वस्तु के लिए नाम, संख्या या उत्पादों और प्रत्येक उत्पाद के लिए कुल मूल्य वाले ऑब्जेक्ट को वापस करना चाहता हूं।

 public class ResultLine{ public ResultLine() { } public string ProductName {get; set;} public string Price {get; set; } public string Quantity {get; set;} } 

इसलिए मैं ProductCode द्वारा समूह के लिए एक समूह का उपयोग करता हूं, फिर मैं योग की गणना करता हूं और प्रत्येक उत्पाद कोड के लिए रिकॉर्ड की संख्या भी गिनता है।

अभी तक मेरे पास इतना ही है:

 List<Product> Lines = LoadProducts(); List<ResultLine> result = Lines .GroupBy(l => l.ProductCode) .SelectMany(cl => cl.Select( csLine => new ResultLine { ProductName =csLine.Name, Quantity = cl.Count().ToString(), Price = cl.Sum(c => c.Price).ToString(), })).ToList<ResultLine>(); 

किसी कारण के लिए, योग ठीक से किया जाता है लेकिन गिनती हमेशा 1 है।

Sampe डेटा:

 List<CartLine> Lines = new List<CartLine>(); Lines.Add(new CartLine() { ProductCode = "p1", Price = 6.5M, Name = "Product1" }); Lines.Add(new CartLine() { ProductCode = "p1", Price = 6.5M, Name = "Product1" }); Lines.Add(new CartLine() { ProductCode = "p2", Price = 12M, Name = "Product2" }); 

नमूना डेटा के साथ परिणाम:

 Product1: count 1 - Price:13 (2x6.5) Product2: count 1 - Price:12 (1x12) 

उत्पाद 1 में गिनती = 2 होनी चाहिए!

मैंने इसे एक साधारण कंसोल एप्लीकेशन में अनुकरण करने की कोशिश की, लेकिन मुझे निम्न परिणाम मिला:

 Product1: count 2 - Price:13 (2x6.5) Product1: count 2 - Price:13 (2x6.5) Product2: count 1 - Price:12 (1x12) 

Product1: केवल एक बार सूचीबद्ध होना चाहिए … उपरोक्त कोड पेस्टबिन पर पाया जा सकता है: http://pastebin.com/cNHTBSie

वेब के समाधान से एकत्रित समाधान "लिनक: समूहबी, सम और गणना"

मुझे नहीं पता कि पहले "नमूना डेटा के साथ परिणाम" कहां से आ रहा है, लेकिन कन्सोल ऐप में समस्या यह है कि आप प्रत्येक समूह में प्रत्येक आइटम को देखने के लिए SelectMany का उपयोग कर रहे हैं।

मुझे लगता है कि आप बस चाहते हैं:

 List<ResultLine> result = Lines .GroupBy(l => l.ProductCode) .Select(cl => new ResultLine { ProductName = cl.First().Name, Quantity = cl.Count().ToString(), Price = cl.Sum(c => c.Price).ToString(), }).ToList(); 

उत्पाद का नाम प्राप्त करने के लिए First() का उपयोग मानता है कि एक ही उत्पाद कोड के साथ प्रत्येक उत्पाद का एक ही उत्पाद नाम है जैसा कि टिप्पणियों में बताया गया है, आप उत्पाद के नाम के साथ-साथ उत्पाद कोड समूह भी कर सकते हैं, जो समान परिणाम देगा यदि नाम हमेशा किसी भी कोड के लिए समान होता है, लेकिन जाहिरा तौर पर ईएफ में बेहतर एसक्यूएल उत्पन्न करता है।

मैं यह भी सुझाव दे सकता हूं कि आपको Quantity और Price गुणों को क्रमशः int और decimal प्रकार में बदलना चाहिए – डेटा के लिए स्ट्रिंग संपत्ति का उपयोग क्यों करना चाहिए जो स्पष्टतः पाठ नहीं है?

निम्नलिखित क्वेरी काम करती है यह प्रत्येक समूह को SelectMany बजाए चयन करने के लिए उपयोग करता है SelectMany प्रत्येक संग्रह से प्रत्येक तत्व पर SelectMany काम करता है उदाहरण के लिए, आपकी क्वेरी में आपके पास 2 संग्रह का नतीजा है। प्रत्येक संग्रह के बजाय सभी को 3 परिणाम SelectMany । निम्नलिखित कोड प्रत्येक IGrouping पर चयनित भाग में काम करता है ताकि आपकी कुल परिचालन सही तरीके से काम कर सके।

 var results = from line in Lines group line by line.ProductCode into g select new ResultLine { ProductName = g.First().Name, Price = g.Sum(_ => _.Price).ToString(), Quantity = g.Count().ToString(), };