Linq का उपयोग करके प्रत्येक समूह में पहला रिकॉर्ड कैसे प्राप्त करें


133

निम्नलिखित अभिलेखों को ध्यान में रखते हुए:

   Id          F1            F2             F3 
 -------------------------------------------------
   1           Nima          1990           10
   2           Nima          1990           11
   3           Nima          2000           12
   4           John          2001           1
   5           John          2002           2 
   6           Sara          2010           4

मैं F1क्षेत्र के आधार पर समूह बनाना चाहता हूं और Idइन अभिलेखों के समान समूह के पहले रिकॉर्ड से सभी क्षेत्र प्राप्त कर सकता हूं :

   Id          F1            F2             F3 
 -------------------------------------------------
   1           Nima          1990           10
   4           John          2001           1
   6           Sara          2010           4

मैं linq का उपयोग करके यह कैसे कर सकता हूँ?

जवाबों:


127
    var res = from element in list
              group element by element.F1
                  into groups
                  select groups.OrderBy(p => p.F2).First();

4
तो खुशी है कि मैंने यह पाया। मुझे त्रुटि संदेश मिला "विधि 'प्रथम' का उपयोग केवल अंतिम क्वेरी ऑपरेशन के रूप में किया जा सकता है। इस उदाहरण में 'FirstOrDefault' पद्धति का उपयोग करने पर विचार करें।" अपने उदाहरण से। क्वेरी के बाद myResult.ToList () एक विधि से गुजरने के बाद मैंने जो सूची बनाई थी, उस पर केवल संचालन। FirstOrDefault का उपयोग करते हुए इसे हल किया
aghost

यह होगा OrderBy(p => p.Id), वे चाहते थे कि यह आईडी द्वारा आदेश दिया गया था न कि कॉलम।
माइक फ्लिन

क्या आप इसके लिए कुछ सहायता प्रदान कर सकते हैं: stackoverflow.com/questions/44764687/…
Si8

यदि समूह से पहला और अंतिम आइटम प्राप्त करना चाहते हैं तो क्या होगा?
संदीप पांडे

176
var result = input.GroupBy(x=>x.F1,(key,g)=>g.OrderBy(e=>e.F2).First());

2
इसने मुझे धाराप्रवाह वाक्य रचना का उपयोग करने का तरीका दिखाया। GroupBy के लिए भार के सीखने की लंबी सूची में जोड़ने के लिए एक - आप सत्ता के एक बहुत देने के लिए दिखाई देते हैं!
रोजर्सिलिटो

1
@rogersillito इसीलिए इसे एक क्वेरी (भाषा एकीकृत क्वेरी - LINQ) कहा जाता है, GroupBy में कई अतिभार भी हैं लेकिन आमतौर पर कुछ ही उपयोग किए जाते हैं, यह भी व्यक्तिगत प्राथमिकता पर निर्भर करता है, जैसे कि कुछ लोग इस रूप में लिखना पसंद करते हैं .GroupBy(x=>x.F1).Select(g=>...), यह समझने में आसान लग सकता है।
राजा राजा

11
आपको इसके .First()साथ प्रतिस्थापित करना चाहिए .FirstOrDefault()या आपको अपवाद मिलेगा:The method 'First' can only be used as a final query operation. Consider using the method 'FirstOrDefault' in this instance instead.
निकोले कोस्तोव

5
@NikolayKostov मैं इसके बारे में जानता हूं, लेकिन मैंने माना कि यहां LINQ का उपयोग LINQ-to-object के रूप में किया जाता है, LINQ-to-संस्थाओं के लिए नहीं, इसलिए हम सुरक्षित रूप से उपयोग कर सकते हैं .First()। ओपी का सवाल वास्तव में सिर्फ लिनाक-टू-ऑब्जेक्ट की देखभाल करने जैसा लगता है, हालांकि उन्होंने इस प्रश्न को भी टैग किया linq-to-entities(यकीन नहीं तो अगर वह समझ गए कि क्या है)।
राजा राजा

1
मुझे यह जवाब पसंद आया, अच्छा लगा।
अजास आजु

8

@Alireza का awnser पूरी तरह से सही है, लेकिन आपको इस कोड का उपयोग करते समय ध्यान देना चाहिए

var res = from element in list
          group element by element.F1
              into groups
              select groups.OrderBy(p => p.F2).First();

जो इस कोड के लिए simillar है क्योंकि आप सूची का आदेश दे रहे हैं और फिर समूह बना रहे हैं ताकि आप समूहों की पहली पंक्ति प्राप्त कर रहे हैं

var res = (from element in list)
          .OrderBy(x => x.F2)
          .GroupBy(x => x.F1)
          .Select()

अब यदि आप कुछ अधिक जटिल करना चाहते हैं जैसे समान समूहन परिणाम लेते हैं, लेकिन F2 का पहला तत्व और अंतिम तत्व F3 या कुछ और कस्टम लेते हैं तो आप इसे कोड bellow करके कर सकते हैं

 var res = (from element in list)
          .GroupBy(x => x.F1)
          .Select(y => new
           {
             F1 = y.FirstOrDefault().F1;
             F2 = y.First().F2;
             F3 = y.Last().F3;
           });

तो आपको कुछ ऐसा मिलेगा

   F1            F2             F3 
 -----------------------------------
   Nima          1990           12
   John          2001           2
   Sara          2010           4

1
नई वस्तु का सीमांकक या विभाजक अल्पविराम नहीं होना चाहिए। कृपया जाँच करें।
नरेदला निठेश रेड्डी

3

आप जो चाहते हैं उसे प्राप्त करने के लिए इसका उपयोग करें। फिर तय करें कि आप कौन से गुण वापस करना चाहते हैं।

yourList.OrderBy(l => l.Id).GroupBy(l => new { GroupName = l.F1}).Select(r => r.Key.GroupName)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.