সি # রূপান্তর তালিকা <স্ট্রিং> অভিধানে <স্ট্রিং, স্ট্রিং>


117

এটি করতে একটি অদ্ভুত জিনিস মনে হতে পারে তবে তা উপেক্ষা করে, অভিধানের একটি তালিকা রূপান্তর করার একটি দুর্দান্ত সংক্ষিপ্ত উপায় আছে যেখানে অভিধানে প্রতিটি মূল মান জোড় তালিকার প্রতিটি স্ট্রিং থাকে। অর্থাত

List = string1, string2, string3
Dictionary = string1/string1, string2/string2, string3/string3

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

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


1
আপনার বৈধ কারণের জন্য আমার আরও ভাল সমাধান রয়েছে, সৎ।

2
আপনি দেখতে চাইতে পারেন হ্যাশসেট <> অভিধান <,> ব্যবহারের পরিবর্তে আপনার প্রয়োজনীয়তা পূরণ করে কিনা।
গ্রেগ

উপরোক্ত মন্তব্যকারীদের চেয়ে আরও সরাসরি: আপনি যদি এটির জন্য আপনার কারণটি ব্যাখ্যা করেন তবে কেউ সম্ভবত আরও ভাল সমাধানের পরামর্শ দিতে পারে।
টিম এস

1
এর চেয়ে ভাল সমাধান আর নেই। আমার কাছে একটি তৃতীয় পক্ষের উপাদান রয়েছে যা এইগুলি ইমেল ঠিকানাগুলির স্ট্রিংগুলির একটি তালিকা ফেরত দেয়। আমার কাছে একটি তৃতীয় পক্ষের উপাদান রয়েছে যা ইমেলগুলি পাঠায় যেখানে এটি একটি অভিধান <স্ট্রিং, স্ট্রিং> পাস করে যেখানে কীটি ইমেল ঠিকানা এবং মান হ'ল প্রাপকদের আসল নাম। তবে, আসল নামটি আবার ইমেল ঠিকানা হতে পারে যার কারণেই আমি একটি তালিকা <স্ট্রিং> অভিধানে একটি অনুবাদ <স্ট্রিং> স্ট্রিং>
জুনসটার

উত্তর:


243

এটা চেষ্টা কর:

var res = list.ToDictionary(x => x, x => x);

প্রথম ল্যাম্বদা আপনাকে কীটি বাছাই করতে দেয়, দ্বিতীয়টি মান দেয়।

আপনি এটির সাথে খেলতে পারেন এবং মানগুলি কী থেকে পৃথক করতে পারেন:

var res = list.ToDictionary(x => x, x => string.Format("Val: {0}", x));

যদি আপনার তালিকায় সদৃশ থাকে তবে Distinct()এটি যুক্ত করুন:

var res = list.Distinct().ToDictionary(x => x, x => x);

সম্পাদনা বৈধ কারণ সম্পর্কে মন্তব্য করতে, আমি মনে করি যে এরকম রূপান্তরগুলির জন্য বৈধ হতে পারে এমন একমাত্র কারণ হ'ল এক পর্যায়ে চাবি এবং ফলস্বরূপ অভিধানের মানগুলি বিভ্রান্ত হতে চলেছে। উদাহরণস্বরূপ, আপনি প্রাথমিক রূপান্তর করবেন, এবং তারপরে কিছু মানকে অন্য কিছু দিয়ে প্রতিস্থাপন করবেন। যদি কীগুলি এবং মানগুলি সর্বদা এক রকম HashSet<String>হয় তবে আপনার অবস্থার জন্য এটি আরও ভাল ফিট করে:

var res = new HashSet<string>(list);
if (res.Contains("string1")) ...

তালিকাটি স্ট্রিং 1, স্ট্রিং 2, স্ট্রিং 3, স্ট্রিং 1 এর মতো হলে এটি ব্যর্থ হবে
রানা

3
@ প্রণয়রানা হ্যাঁ, এটি হবে। এটি এড়াতে আপনি .Distinct()পরে যুক্ত করতে পারেন list
dasblinkenlight

ধন্যবাদ। আমি টুডেয়ারিয়াস ফাংশনটি মিস করেছি। যারা মূলত একই উত্তর দিয়েছেন তাদের প্রত্যেককে ধন্যবাদ। আমি সবাইকে উন্নত করেছিলাম তবে কেবল একটি উত্তর গ্রহণ করতে পারি। এটি কেবলমাত্র একজনের সাথে পৃথক কোড যুক্ত ছিল তাই আমার মতে এটি সবচেয়ে সম্পূর্ণ।
জনস্টার

11

এটা ব্যবহার কর:

var dict = list.ToDictionary(x => x);

এমএসডিএন দেখুনআরও তথ্যের জন্য ।

প্রনয় মন্তব্যগুলিতে যেমন উল্লেখ করেছেন, তালিকায় একাধিকবার উপস্থিত থাকলে এটি ব্যর্থ হবে।
আপনার নির্দিষ্ট প্রয়োজনীয়তার উপর নির্ভর করে আপনি হয় var dict = list.Distinct().ToDictionary(x => x);পৃথক আইটেমের অভিধান পেতে ব্যবহার করতে পারেন বা আপনি তার ToLookupপরিবর্তে ব্যবহার করতে পারেন :

var dict = list.ToLookup(x => x);

এটি ILookup<string, string>মূলত একইরূপে ফিরে আসবে IDictionary<string, IEnumerable<string>>, সুতরাং এর নীচে প্রতিটি স্ট্রিং উদাহরণ সহ স্বতন্ত্র কীগুলির একটি তালিকা পাবেন।


তালিকাটি স্ট্রিং 1, স্ট্রিং 2, স্ট্রিং 3, স্ট্রিং 1 এর মতো হলে এটি ব্যর্থ হবে
রানা

1

ব্যবহার করে ToDictionary:

var dictionary = list.ToDictionary(s => s);

যদি এটি সম্ভব হয় যে কোনও স্ট্রিং পুনরাবৃত্তি হতে পারে, Distinctতবে তালিকায় প্রথমে একটি কল করুন (সদৃশগুলি অপসারণ করতে), বা ToLookupএমন কী ব্যবহার করুন যা প্রতি কী অনুসারে একাধিক মানের জন্য অনুমতি দেয়।


0

তুমি ব্যবহার করতে পার:

var dictionary = myList.ToDictionary(x => x);

0

সম্পাদনা

সদৃশ নিয়ে কাজ করার আরেকটি উপায় হ'ল আপনি এটি করতে পারেন

var dic = slist.Select((element, index)=> new{element,index} )
            .ToDictionary(ele=>ele.index.ToString(), ele=>ele.element);

অথবা


সহজ উপায় হল

var res = list.ToDictionary(str => str, str=> str); 

তবে নিশ্চিত হয়ে নিন যে কোনও স্ট্রিং পুনরাবৃত্তি করছে না ... আবার উপরের কোডটি আপনার পক্ষে কাজ করবে না

যদি স্ট্রিং থাকে তবে এর চেয়ে ভাল করার চেয়ে পুনরাবৃত্তি হচ্ছে

Dictionary<string,string> dic= new Dictionary<string,string> ();

    foreach(string s in Stringlist)
    {
       if(!dic.ContainsKey(s))
       {
        //  dic.Add( value to dictionary
      }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.