চেহারা () এবং অভিধান (তালিকার () এর মধ্যে পার্থক্য


165

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

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

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


1
এক দেখতে চাইতে পারেন কি-is-দফা অফ lookuptkey-telement
nawfal

উত্তর:


255

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

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

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

লক্ষ্য করুন একটি বাস্তবায়ন বিস্তারিত হিসাবে, এর কংক্রিট বাস্তবায়নের IGrouping<,>যা মান কার্যকরী জন্য ব্যবহার করা হয় IList<TValue>, যার মানে এটি সঙ্গে ব্যবহার করার জন্য কার্যকর Count(), ElementAt()ইত্যাদি


যদি কোনও অস্তিত্বহীন কী অনুসন্ধানের ফলাফল ব্যতিক্রমের পরিবর্তে খালি অনুক্রমের ফলাফল করে, তবে এটি সাধারণ উদ্দেশ্য সংগ্রহ ইমো হিসাবে খুব বেশি ব্যবহৃত হয় না। অপরিবর্তনীয় সংগ্রহের ক্ষেত্রে এটি ঠিক আছে, যা লিনক অনুসন্ধানগুলির উপ-উত্পাদন।
নওফাল

@ নওফাল - লুপআপের জন্য ঠিক এটিই। এমএসডিএন থেকে : "আইউনামেবল <T> প্রয়োগ করে এমন কোনও বস্তুতে টু লকআপে কল করে আপনি লকআপ <টিকি, টিলেটমেন্ট> এর উদাহরণ তৈরি করতে পারেন" "
নিলাল কানাহটন

50

আকর্ষণীয় যে সত্যিকারের বৃহত্তম পার্থক্য কেউ বর্ণনা করেনি (সরাসরি এমএসডিএন থেকে নেওয়া ):

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


51
প্রশ্নটি যাচাই করুন: এটি লুপআপ <টি কে, টিভিয়ালিউ> এবং একটি অভিধান <টি কে, তালিকা <টিয়ালু>> এর মধ্যে পার্থক্য সম্পর্কে, যাতে পার্থক্যটি ইতিমধ্যে স্বতন্ত্র।
মার্টাও

5
@ মারতাও কিছু লোক এই প্রশ্নটি খুঁজে বার করে যখন অনুসন্ধান এবং অভিধানের মধ্যে পার্থক্য বুঝতে গুগল করে। এই উত্তরটি সত্যিই দরকারী।
জাকুবিসন

34

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

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

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


11

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

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


1
@ জনবস্তোস পারফরম্যান্সের দিক থেকে, না। এটি সম্পূর্ণ যুক্তিযুক্ত। আপনি অন্য কাউকে আপনার নীচে থেকে এটি পরিবর্তন করে নিয়ে যাওয়া নিয়ে চিন্তা করবেন না এমন আশেপাশের কাঠামোর রেফারেন্সগুলি আপনি দিতে পারেন। আপনি এই ধারণা নিয়ে ধারণা স্থাপন করতে পারেন যে এটি পরিবর্তনযোগ্য নয় যে এটি পরিবর্তনযোগ্য না হলে আপনি পারতেন না।
12 '

ধন্যবাদ, সার্ভি, এটি একটি খুব ভাল পয়েন্ট যখন আপনি প্রায়শই অনেকগুলি ভেরিয়েবল বাইফের কাছাকাছি যাচ্ছেন - কমপক্ষে এটি নিশ্চিত যে আপনি এটি পরিবর্তন করতে পারবেন না। ধন্যবাদ!
জন বুস্টোস

2
@ জোহান বুস্টোস মনে রাখবেন যে পদ্ধতি প্যারামিটারটি পাস করার ডিফল্ট পদ্ধতিটি মান অনুসারে হয়, আপনাকে স্পষ্টভাবে বাইরেফ যুক্ত করতে হবে এবং এটি এমন কিছু যা খুব কমই করা উচিত। এই ডেটা স্ট্রাকচারগুলি ক্লাস, যা তাদের রেফারেন্সের ধরণের করে তোলে তাই মানটি পাস করা হল রেফারেন্সের মান, যার কারণে এটি অন্য পদ্ধতিতে পাস করা কলারের দৃশ্যমান পরিবর্তন হতে পারে।
12 '

ধন্যবাদ, সার্ভি, যা আমি করছি তার নিরিখে আমার জন্য কৃমির সম্পূর্ণ নতুন ক্যান খুলে দিয়েছে :) তবে আপনি কী বলছেন তা আমি বুঝতে পারি না। ধন্যবাদ !!
জন বুস্টোস

প্রচ্ছদের নীচে আপনি কি জানেন কী লুপআপ কীটির জন্য হ্যাশবকেট ব্যবহার করে?
পাপারাজ্জো

10

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

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


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);
        // ...

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

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

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

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