c# - সন্ধানের মধ্যে পার্থক্য()এবং অভিধান(তালিকা())




.net vb.net linq (6)

আমি আমার মাথা মোড়ানো চেষ্টা করছি যা তথ্য কাঠামো সবচেয়ে দক্ষ এবং কখন / যেখানে কোন ব্যবহার করতে হয়।

এখন, আমি কেবলমাত্র স্ট্রাকচারগুলি যথেষ্ট ভালভাবে বুঝতে পারছি না, কিন্তু কীভাবে একটি ILookup(of key, ...) একটি Dictionary(of key, list(of ...)) থেকে Dictionary(of key, list(of ...)) আলাদা?

এছাড়াও আমি একটি ILookup ব্যবহার করতে চাই যেখানে এবং এটি প্রোগ্রাম গতি / মেমরি / তথ্য অ্যাক্সেস ইত্যাদি পদে আরো দক্ষ হবে, ইত্যাদি?


Answers

ব্যতিক্রম যখন একটি বিকল্প নয়, অনুসন্ধানের জন্য যান

আপনি Dictionary হিসাবে দক্ষ হিসাবে গঠন পেতে চেষ্টা করছেন তবে আপনি নিশ্চিত নন যে ইনপুটটিতে কোন সদৃশ কী নেই, Lookup নিরাপদ।

অন্য একটি উত্তর হিসাবে উল্লেখ করা হয়েছে, এটি নল কীগুলিকে সমর্থন করে এবং নির্বিচারে ডেটা দিয়ে জিজ্ঞাসা করার সময় সর্বদা একটি বৈধ ফলাফল প্রদান করে, তাই এটি অজানা ইনপুট (ব্যতিক্রমগুলি বাড়াতে অভিধানের চেয়ে কম প্রবণতা) হিসাবে আরো স্থিতিশীল বলে মনে হয়।

এবং এটি বিশেষভাবে সত্য যদি আপনি এটি System.Linq.Enumerable.ToDictionary ফাংশনের সাথে তুলনা করেন:

// won't throw
new[] { 1, 1 }.ToLookup(x => x); 

// System.ArgumentException: An item with the same key has already been added.
new[] { 1, 1 }.ToDictionary(x => x);

বিকল্প একটি foreach লুপ ভিতরে আপনার নিজস্ব সদৃশ কী ব্যবস্থাপনা কোড লিখতে হবে।

কর্মক্ষমতা বিবেচনা, অভিধান: একটি পরিষ্কার বিজয়ী

যদি আপনার কোন তালিকা প্রয়োজন না হয় এবং আপনি একটি বিশাল সংখ্যক আইটেম পরিচালনা করতে যাচ্ছেন, Dictionary (অথবা এমনকি আপনার নিজস্ব কাস্টম পরিকল্পিত কাঠামো) আরও কার্যকর হবে:

        Stopwatch stopwatch = new Stopwatch();
        var list = new List<string>();
        for (int i = 0; i < 5000000; ++i)
        {
            list.Add(i.ToString());
        }
        stopwatch.Start();
        var lookup = list.ToLookup(x => x);
        stopwatch.Stop();
        Console.WriteLine("Creation: " + stopwatch.Elapsed);

        // ... Same but for ToDictionary
        var lookup = list.ToDictionary(x => x);
        // ...

লুকের প্রতিটি আইটেমের জন্য আইটেমগুলির একটি তালিকা বজায় রাখতে হবে, এটি অভিধানের চেয়ে ধীর গতির (প্রচুর সংখ্যক আইটেমের জন্য 3x ধীর)

সন্ধানের গতি: সৃষ্টি: 00: 00: 01.5760444

অভিধান গতি: সৃষ্টি: 00: 00: 00.4418833


দুটি উল্লেখযোগ্য পার্থক্য:

  • লুকান অপরিবর্তনীয়। Yay :) (অন্তত, আমি বিশ্বাস করি কংক্রিট ILookup , এবং ILookup ইন্টারফেস কোনও পরিবর্তনকারী সদস্য সরবরাহ করে না। অবশ্যই, অন্যান্য পরিবর্তনযোগ্য বাস্তবায়নও হতে পারে।)
  • যখন আপনি একটি কী সন্ধান করেন যা কোনও KeyNotFoundException উপস্থিত হয় না, তখন আপনি KeyNotFoundException পরিবর্তে ফাঁকা ক্রমটি ফিরে KeyNotFoundException । (অতএব, কোনও TryGetValue , AFAICR।)

তারা দক্ষতা সমতুল্য হতে পারে - অনুসন্ধানের Dictionary<TKey, GroupingImplementation<TValue>> দৃশ্যের পিছনে ব্যবহার করা যেতে পারে। আপনার প্রয়োজনীয়তা উপর ভিত্তি করে তাদের মধ্যে চয়ন করুন। ব্যক্তিগতভাবে আমি দেখি যে Dictionary<TKey, List<TValue>> সাধারণত Dictionary<TKey, List<TValue>> তুলনায় আরও ভাল হয় তবে এটি উপরের প্রথম দুটি পয়েন্টের কারণে হয়।

উল্লেখ্য যে বাস্তবায়ন হিসাবে, IGrouping<,> কংক্রিট বাস্তবায়ন IGrouping<,> যা মানগুলির জন্য ব্যবহার করা হয় IList<TValue> প্রয়োগ করে, যার অর্থ হল এটি Count() , ElementAt() ইত্যাদি ব্যবহার করার জন্য কার্যকর।


আরেকটি পার্থক্য এখনও উল্লেখ করা হয় না যে Lookup () নল কী সমর্থন করে :

লুকআপ ক্লাস ILookup ইন্টারফেস প্রয়োগ করে। লুপটি একই অভিধানে মানচিত্রের মাপের একাধিক মানকে ছাড়াই অভিধানের অনুরূপ, এবং নাল কীগুলি সমর্থিত।


একটি Dictionary<Key, List<Value>> এবং একটি Lookup<Key, Value> উভয় যৌক্তিকভাবে একইভাবে সংগঠিত ডেটা ধরে রাখতে পারে এবং উভয় দক্ষতা একই ক্রম। মূল পার্থক্য হল একটি লুকআপটি অপরিবর্তনীয়। এটিতে কোনও Add() পদ্ধতি নেই এবং কোনও পাবলিক কনস্ট্রাক্টর নেই (এবং জোন উল্লেখ করেছেন যে আপনি ব্যতিক্রম ছাড়াই একটি অ-বিদ্যমান কী অনুসন্ধান করতে পারেন এবং গোষ্ঠীর অংশ হিসাবে কী কী আছে)।

আপনি যা ব্যবহার করেন, এটি আসলেই আপনি কীভাবে তাদের ব্যবহার করতে চান তার উপর নির্ভর করে। যদি আপনি একাধিক মানগুলির কী মানচিত্র বজায় রাখেন যা ক্রমাগত সংশোধন করা হচ্ছে, তবে একটি Dictionary<Key, List<Value>> সম্ভবত এটি পরিবর্তনযোগ্য হওয়ার পরে ভাল।

তবে, যদি আপনার কাছে তথ্য ক্রমানুসারে থাকে এবং শুধুমাত্র কী দ্বারা সংগঠিত ডেটাটির কেবলমাত্র পঠনযোগ্য দর্শন দেখতে চান তবে একটি সন্ধান করা খুব সহজেই তৈরি করা এবং আপনাকে শুধুমাত্র একটি কেবলমাত্র পাঠযোগ্য স্ন্যাপশট দেবে।


যে কেউ প্রকৃতই সবচেয়ে বড় পার্থক্য ( MSDN থেকে সরাসরি নেওয়া হয়েছে) উল্লেখ করেছেন তা আকর্ষণীয়:

একটি লুকান একটি অভিধান অনুরূপ। পার্থক্য হল অভিধানের মানচিত্রগুলি একক মানগুলি, যখন মানগুলির সংগ্রহের জন্য একটি লুকাপ মানচিত্র কী।


SelectMany() আপনাকে একটি বহুমাত্রিক ক্রমকে এমনভাবে ভেঙ্গে দেয় যা অন্যথায় দ্বিতীয় Select() বা লুপের প্রয়োজন হবে।

এই ব্লগ পোস্টে আরো বিস্তারিত।







c# .net vb.net linq