<টিকি, টেলিমেন্ট> এর লুকআপটি কী?


155

এমএসডিএন লুকআপটিকে এভাবে ব্যাখ্যা করে:

একটি Lookup<TKey, TElement> অনুরূপ ক Dictionary<TKey, TValue>। পার্থক্যটি হ'ল একটি অভিধান <টি কে, টিভিয়াল> একক মানগুলির কীগুলি ম্যাপ করে, যেখানে একটি লুক <টিকি, টেলিমেন্ট> মান সংগ্রহের জন্য কী ম্যাপ করে।

আমি এই ব্যাখ্যাটি বিশেষভাবে সহায়ক বলে মনে করি না। লুকআপ কি জন্য ব্যবহার করা হয়?

উত্তর:


215

এটি একটি IGroupingএবং অভিধানের মধ্যে একটি ক্রস । এটি আপনাকে কীগুলির সাহায্যে আইটেমগুলি একসাথে গোষ্ঠীভূত করতে দেয় তবে তারপরে একটি দক্ষ পদ্ধতিতে (কীভাবে তাদের সকলের উপরে পুনরাবৃত্তি না করে, যা GroupByআপনাকে করতে দেয়) সেগুলি দিয়ে এগুলি অ্যাক্সেস করতে পারে।

উদাহরণস্বরূপ, আপনি .NET প্রকারের ভার নিতে পারেন এবং নেমস্পেসের মাধ্যমে একটি অনুসন্ধান তৈরি করতে পারেন ... তারপরে খুব সহজেই একটি নির্দিষ্ট নেমস্পেসে সমস্ত প্রকারে পৌঁছাতে পারেন:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;

public class Test
{
    static void Main()
    {
        // Just types covering some different assemblies
        Type[] sampleTypes = new[] { typeof(List<>), typeof(string), 
                                     typeof(Enumerable), typeof(XmlReader) };

        // All the types in those assemblies
        IEnumerable<Type> allTypes = sampleTypes.Select(t => t.Assembly)
                                               .SelectMany(a => a.GetTypes());

        // Grouped by namespace, but indexable
        ILookup<string, Type> lookup = allTypes.ToLookup(t => t.Namespace);

        foreach (Type type in lookup["System"])
        {
            Console.WriteLine("{0}: {1}", 
                              type.FullName, type.Assembly.GetName().Name);
        }
    }
}

(আমি সাধারণত varএই ঘোষণাগুলির বেশিরভাগটি সাধারণ কোডে ব্যবহার করি )


59
আমি মনে করি এই উত্তরটি আরও ভাল করে তুলতে আপনি কয়েকটি ভার প্রতিস্থাপন করতে পারেন। শেখার উদ্দেশ্যে আমি মনে করি এটি অনুসরণ করা আরও সহজ, যখন প্রকারগুলি স্পষ্টভাবে প্রকাশ করা হয়। মাত্র আমার 2 সেন্ট :)
অ্যালেক্স বারানোস্কি

3
যদি এটি উভয় বিশ্বের সেরা থাকে, তবে কেন একটি অভিধান নিয়ে বিরক্ত করবেন?
কাইল বারান

15
@ কাইলবারান: কারণ এটি আসল কী / মান জোড় সংগ্রহের জন্য অর্থহীন হবে, যেখানে মূল প্রতি একক মান রয়েছে।
জন স্কিটি

12
@ কাইলবারান Lookup<,>কেবল একটি অপরিবর্তনীয় সংগ্রহ ( Addযেমন কোনও পদ্ধতি নেই ) যার সীমিত ব্যবহার রয়েছে। তদ্ব্যতীত, এটি এই অর্থে সাধারণ উদ্দেশ্য সংগ্রহ নয় যে আপনি যদি অস্তিত্বহীন কীতে সন্ধান করেন তবে ব্যতিক্রমের পরিবর্তে খালি ক্রম পাবেন যা কেবলমাত্র বিশেষ প্রসঙ্গে যেমন লিনাক সহ অর্থবোধক। এটি এমএস ক্লাসের জন্য কোনও পাবলিক কনস্ট্রাক্টর সরবরাহ করেনি এই বিষয়টি দিয়ে ভাল যায়।
নওফাল

> Bobbymcr - -> jonskeet পড়া উত্তর অর্ডার jwg হয়
SNR

58

এটি সম্পর্কে চিন্তা করার এক উপায় এটি: Lookup<TKey, TElement>এর মতো Dictionary<TKey, Collection<TElement>>। মূলত শূন্য বা আরও বেশি উপাদানের একটি তালিকা একই কী দিয়ে ফেরত দেওয়া যেতে পারে।

namespace LookupSample
{
    using System;
    using System.Collections.Generic;
    using System.Linq;

    class Program
    {
        static void Main(string[] args)
        {
            List<string> names = new List<string>();
            names.Add("Smith");
            names.Add("Stevenson");
            names.Add("Jones");

            ILookup<char, string> namesByInitial = names.ToLookup((n) => n[0]);

            // count the names
            Console.WriteLine("J's: {0}", namesByInitial['J'].Count()); // 1
            Console.WriteLine("S's: {0}", namesByInitial['S'].Count()); // 2
            Console.WriteLine("Z's: {0}", namesByInitial['Z'].Count()); // 0, does not throw
        }
    }
}

2
দেখার ফলাফলের মধ্যে শূন্য উপাদান থাকতে পারে? আপনি এটি কিভাবে পাবেন? (যতক্ষণ আমি বলতে পারি লুপআপটি সর্বজনীনভাবে অপরিবর্তনীয় এবং আমি মনে করি না যে টললুকআপ কার্যকরভাবে কীগুলি উদ্ভাবন করতে পারে S)
জন স্কিটি

8
প্রযুক্তিগতভাবে, হ্যাঁ, যেহেতু লুকআপ অস্তিত্বহীন কীটির জন্য একটি খালি সংগ্রহ প্রদান করে (আমি এটি প্রকাশ করে এমন একটি কোড নমুনা যুক্ত করতে আমার পোস্ট সম্পাদনা করেছি)।
ববিএমসিআর

> Bobbymcr - -> jonskeet পড়া উত্তর অর্ডার jwg হয়
SNR

একটি খুব পরিষ্কার এবং সহায়ক উত্তর, আমি আশা করি এটি নির্বাচন করা হয়েছে।
মিনিটে মিনিট

25

এর একটি ব্যবহার Lookupহতে পারে একটি বিপরীতে Dictionary

মনে করুন আপনার কাছে একটি ফোনবুক Dictionaryচাবি হিসাবে একচেটিয়া (অনন্য) নামের সাথে সংযুক্ত হয়েছে, প্রতিটি নাম একটি ফোন নম্বরের সাথে যুক্ত। তবে ভিন্ন নামের দুটি ব্যক্তি একই ফোন নম্বরটি ভাগ করতে পারে। এটি কোনওর জন্য কোনও সমস্যা নয় Dictionary, যা দুটি কী একই মানের সাথে মিলে যায় তা যত্ন করে না।

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

dictionary["555-6593"] = "Dr. Emmett Brown";
dictionary["555-6593"] = "Marty McFly";

মানে দ্বিতীয় এন্ট্রি প্রথমটিকে ওভাররাইট করে - ডকটি আর তালিকাভুক্ত থাকে না।

একই তথ্যকে কিছুটা ভিন্ন উপায়ে লেখার চেষ্টা করা হচ্ছে:

dictionary.Add("555-6593", "Dr. Emmett Brown");
dictionary.Add("555-6593", "Marty McFly");

দ্বিতীয় লাইনে একটি ব্যতিক্রম ছুঁড়ে ফেলবে যেহেতু আপনি Addইতিমধ্যে একটি কী কী করতে পারবেন না Dictionary

[অবশ্যই, আপনি উভয় দিক ইত্যাদিতে লকআপগুলি করতে কিছু অন্যান্য একক ডেটা কাঠামো ব্যবহার করতে চাইতে পারেন example উদাহরণটির অর্থ হল যে প্রতিটি বারের পরবর্তী সময়গুলি পরিবর্তিত Lookupহতে আপনাকে পুনরায় তৈরি করতে হবে Dictionary। তবে কিছু তথ্যের জন্য এটি সঠিক সমাধান হতে পারে]]


উত্তরটি ধারণাটি বোঝার জন্য জরুরী। +1 টি। > Bobbymcr - -> jonskeet পড়া উত্তর অর্ডার jwg হয়
SNR

15

আমি এটির আগে সফলভাবে ব্যবহার করিনি, তবে এখানে আমার যেতে হবে:

একটি Lookup<TKey, TElement>একটি অনন্য বাধ্যতা ছাড়া প্রায় কাছাকাছি একটি টেবিলের উপর একটি (রিলেশনাল) ডাটাবেসের সূচক মত আচরণ করবে। আপনি অন্যটি যে জায়গাতে ব্যবহার করবেন একই জায়গায় এটি ব্যবহার করুন।


5

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

একটি চেহারা সম্ভাব্য কয়েকটি মানকে মানচিত্র করবে।

লুপআপ ["স্মিথ"] ["জন"] হবে এক বিলিয়ন আকারের সংগ্রহ।


আপনার উত্তরটি আমার ফলো-আপ প্রশ্নকে অনুপ্রাণিত করেছে "একাধিক সূচী দিয়ে কীভাবে লকআপ ()?" । একাধিক সূচী, অনুসন্ধান সহ আমি কীভাবে এর পুনরুত্পাদন করতে পারি? আপনি সম্ভবত অন্য যে কোনও নমুনা বা রেফারেন্স ব্যবহার করে এটি ব্যবহারের উত্তর দিতে পারবেন Lookup["Smith"]["John"] ?
ফুলপ্রুফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.