দলবদ্ধকরণের সাথে তালিকায় একটি অভিধান তৈরি করুন


106

আমার একটি তালিকায় নিম্নলিখিত বিষয় রয়েছে:

public class DemoClass
{
    public int GroupKey { get; set; }
    public string DemoString { get; set; }
    public object SomeOtherProperty { get; set; }
}

এখন, আমি এর থেকে নিম্নলিখিত অভিধান তৈরি করতে চাই:

Dictionary<int, List<DemoClass>>

আমি List<DemoClass>সম্পত্তি অনুসারে দলবদ্ধ করতে চাই GroupKey, তবে এটি কীভাবে হয় এবং কিছু সহায়তা করে তা আমি বুঝতে পারি না।

কিছুটা চিন্তা করার পরে, আমি এর সাথে প্রয়োজনীয় আচরণটি অর্জন করেছি:

var groupedDemoClasses = from demoClass in mySepcialVariableWhichIsAListOfDemoClass
                            group demoClass by demoClass.GroupKey
                            into groupedDemoClass
                            select groupedDemoClass;
var neededDictionary = groupedDemoClass.ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

তবে, এটিকে একটি বিবৃতি দেওয়ার কোনও উপায় আছে কি?

উত্তর:



198

কেবল মাকান্দারের পরামর্শটি কংক্রিট করতে:

var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
                             .GroupBy(x => x.GroupKey)
                             .ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

আপনি যদি সংক্ষিপ্ত পরিবর্তনশীল নামগুলি অবশ্যই ব্যবহার করেন তবে আপনি এটি সংক্ষিপ্ত করে তুলবেন :)

তবে, আমি কি পরামর্শ দেব যে কোনও লুকআপ আরও উপযুক্ত হতে পারে? একটি লুকআপ মূলত একটি কী থেকে শুরু করে একটি অভিধান IEnumerable<T>- যদি আপনার তালিকার মতো মানগুলির সত্যিকার প্রয়োজন না হয় তবে এটি তোলুকআপ কল দিয়ে কোডটিকে আরও ছোট (এবং আরও দক্ষ) করে তোলে :

var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
                             .ToLookup(x => x.GroupKey);

1
আমি ভেবেছিলাম যে কোনও দীর্ঘমেয়াদী-পরিবেশে একটি বিল্ট করা অভিধানের তুলনায় একটি অনুসন্ধান খুব ভাল অভিনয় করে না, কারণ এটি প্রতিটি অনুরোধের জন্য ফলাফলকে নতুন করে গড়ে তোলে ... দয়া করে আমাকে সংশোধন করুন, যদি আমি ভুল হই!
Andreas Niedermair

না, এটি পুরো চেহারা তৈরি করে। সাধারণভাবে, টএক্সএক্সএক্স স্থগিত কার্যকরকরণ ব্যবহার করে না।
জন স্কিটি

1
(আপনি সম্ভবত একটি দলবদ্ধকরণের কথা ভাবছেন, যা সত্যই পিছিয়ে আছে))
জন স্কিচ

1
আমি যদি এতটা তীব্র না হতাম আমি আপনাকে ভোট দিয়েছি। লিনকের জন্য এসেছিলেন, আমি যে ডেটা স্ট্রাকচারের কথা শুনিনি তার জন্যই থাকলাম!
ক্রিস ম্যাককাল

2
@ সাসিক্ট: মডেলটি হ'ল আপনি যে কোনও কিছু সন্ধান করতে পারেন এবং কীটি উপস্থিত না থাকলে আপনি খালি সংগ্রহ পাবেন get এটি প্রায়শই ট্রিগেটভ্যালু পদ্ধতির চেয়ে বেশি কার্যকর, আইএমও।
জন স্কিটি

6

আপনি ইতিমধ্যে এটি ওয়ান-লাইনার তৈরি করেছেন। শুধু করা ToDictionaryআপনার প্রথম লাইনের শেষে। আপনি যদি এটি আরও সংক্ষিপ্ত হতে চান তবে ক্যোরি সিনট্যাক্সের পরিবর্তে কার্যকরী রচনা বাক্য গঠন ব্যবহার করুন।


3

আমি এখানে সামান্য বিষয় ছেড়ে চলেছি , তবে আমি এই থ্রেডটি পেয়েছিলাম কারণ আমি লিনক-তে একটি অভিধানের অভিধান তৈরি করার উপায় খুঁজছিলাম, এবং এখানে কথোপকথন আমাকে উত্তরটিতে নিয়ে গেছে ...

আপনি বহু-স্তরের অভিধান তৈরি করতে লিনক ব্যবহার করতে পারেন, যা আপনি সন্ধান করতে চান এমন একাধিক কী বা মাত্রা পেয়েছেন এমন পরিস্থিতিতে তৈরির জন্য দরকারী। কৌশলটি একটি গোষ্ঠী তৈরি করা এবং এরপরে এটি অভিধানে রূপান্তর করা:

  Dim qry = (From acs In ActualSales _
             Group By acs.ProductID Into Group _
             Select ProductID, Months = Group.ToDictionary(Function(c) c.Period) _
            ).ToDictionary(Function(c) c.ProductID)

ফলস্বরূপ কোয়েরি নিম্নলিখিত হিসাবে ব্যবহার করা যেতে পারে:

 If qry.ContainsKey(_ProductID) Then
      With qry(_ProductID)
          If .Months.ContainsKey(_Period) Then
             ...
          End If
      End With
 End If

আশা করি এই যে কারও জন্য এই ধরণের প্রশ্নের প্রয়োজন হয় এটি সহায়ক this

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.