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




.net vb.net (4)

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

আপনি 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

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

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

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


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

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


একটি ILookup<K,V> এবং একটি Dictionary<K, List<V>> মধ্যে প্রাথমিক পার্থক্য হল ILookup<K,V> পরিবর্তনযোগ্য; আপনি কী যোগ বা অপসারণ করতে পারেন, এবং তালিকায় থাকা তালিকা থেকে আইটেম যুক্ত বা অপসারণ করতে পারেন। একটি ILookup অপরিবর্তনীয় এবং তৈরি একবার পরিবর্তন করা যাবে না।

উভয় পদ্ধতির অন্তর্নিহিত বাস্তবায়ন একই বা একই রকম হবে, সুতরাং তাদের অনুসন্ধানের গতি এবং মেমরি পাদচরণ প্রায় একই রকম হবে।


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

  • লুকান অপরিবর্তনীয়। 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() ইত্যাদি ব্যবহার করার জন্য কার্যকর।





linq