লিনক ব্যবহার করে কীভাবে প্রতিটি গ্রুপে প্রথম রেকর্ড পাবেন


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

আমি লিনক ব্যবহার করে এটি কীভাবে করব?

উত্তর:


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

4
খুব খুশী আমি এটি পেয়েছি। আমি ত্রুটি বার্তা পেয়েছি "পদ্ধতি 'প্রথম' কেবলমাত্র একটি চূড়ান্ত ক্যোয়ারী অপারেশন হিসাবে ব্যবহার করা যেতে পারে instead আপনার উদাহরণ থেকে কোয়েরিটি আমার পদ্ধতিতে.ToList () কোনও পদ্ধতিতে পাস করার পরে আমি কেবল তালিকার অপারেশন করেছি। ফার্স্টআরডিফল্ট ব্যবহার করে এটি এর সমাধান হয়েছে
আগস্ট

এটি হ'ল 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 জন্য overloads শেখার দীর্ঘ তালিকা যোগ করতে এক - আপনি ক্ষমতার অনেক দিতে মনে হয়!
রোজারসিলিটো

1
@ আরগারসিলিতো এ কারণেই এটিকে কোয়েরি বলা হয় (ল্যাঙ্গুয়েজ ইন্টিগ্রেটেড ক্যোয়ারী - লিনকিউ), এছাড়াও গ্রুপপাইয়ের অনেক বেশি ওভারলোড রয়েছে তবে সাধারণভাবে ব্যবহৃত হয় কয়েকটি, এটি ব্যক্তিগত পছন্দের উপরও নির্ভর করে যেমন কিছু লোক এটিকে লিখতে পছন্দ করে .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
@ নিকোলেকোস্টভ আমি এ সম্পর্কে জানি তবে আমি ধরেই নিয়েছিলাম যে এখানে লিনকুই লিনকু-টু-অবজেক্ট হিসাবে ব্যবহৃত হয়, লিনকু-টু-সত্তা নয়, তাই আমরা নিরাপদে ব্যবহার করতে পারি .First()। ওপির প্রশ্নটি দেখতে আসলে লিনাক-টু-অবজেক্ট সম্পর্কে যত্নশীল হওয়ার মতো দেখায়, যদিও তিনি এই প্রশ্নটিও ট্যাগটি দিয়েছিলেন linq-to-entities(তিনি কী তা বুঝতে পেরেছিলেন কিনা তা নিশ্চিত নয়)।
কিং কিং

1
আমি এই উত্তরগুলি পছন্দ করেছি, খুব ভাল।
আজাস আজু

8

@ অ্যালিরেজার অ্যানজার পুরোপুরি সঠিক, তবে আপনাকে অবশ্যই এই কোডটি ব্যবহার করার সময় লক্ষ্য করতে হবে

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

যা এই কোডটির সাথে সিমিলার কারণ আপনি তালিকার অর্ডার দিচ্ছেন এবং তারপরে গ্রুপিং করুন যাতে আপনি প্রথম সারির গোষ্ঠী পাচ্ছেন

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

এখন আপনি যদি আরও জটিল কিছু করতে চান তবে একই গ্রুপিংয়ের ফলাফলটি গ্রহণ করুন তবে F2 এর প্রথম উপাদান এবং F3 এর শেষ উপাদান বা আরও কিছু কাস্টম গ্রহণ করুন আপনি কোড বেলো স্টাডিং করে এটি করতে পারেন

 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

নতুন অবজেক্টের ডিলিমিটার বা বিভাজকটি কমা নয় সেমি কোলন হওয়া উচিত lease
নরেদেলা নীতেশ রেড্ডি

3

আপনি যা চান তা অর্জন করতে এটি ব্যবহার করুন। তারপরে আপনি কোন বৈশিষ্ট্য ফিরিয়ে দিতে চান তা স্থির করুন।

yourList.OrderBy(l => l.Id).GroupBy(l => new { GroupName = l.F1}).Select(r => r.Key.GroupName)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.