আমি কি <টিকি, টিভিয়াল> এন্ট্রিগুলির অভিধানের জন্য একটি সংগ্রহ সূচনা ব্যবহার করতে পারি?


94

আমি পরবর্তী বিট কোডের জন্য একটি সংগ্রহ সূচনা ব্যবহার করতে চাই:

public Dictionary<int, string> GetNames()
{
    Dictionary<int, string> names = new Dictionary<int, string>();
    names.Add(1, "Adam");
    names.Add(2, "Bart");
    names.Add(3, "Charlie");
    return names;
}

সুতরাং সাধারণত এটির মতো কিছু হওয়া উচিত:

return new Dictionary<int, string>
{ 
   1, "Adam",
   2, "Bart"
   ...

তবে এর সঠিক বাক্য গঠন কী?


এই পোস্টটি দেখুন: marcin-chwedczuk.github.io/…
csharpfolk


মনে হয় না যে এটি একটি দ্বিপ, কারণ তারা জিজ্ঞাসা করেছিল, শর্টহ্যান্ড অভিধান ঘোষণার বাক্য গঠনের জন্য নয়, তবে কেন শর্টহ্যান্ড তাদের (প্রাচীন) সেটআপটিতে কাজ করছে না।
এনএইচ।

উত্তর:


157
var names = new Dictionary<int, string> {
  { 1, "Adam" },
  { 2, "Bart" },
  { 3, "Charlie" }
};

4
ইনিশিয়ালাইজার কখন কাজ করে? এটি কি কেবলমাত্র Dictionary<TKey, TValue>সাবক্লাসের জন্য বা এটিতেও কাজ করবে ICollection<KeyValuePair<TKey, TValue>>?
শিমি ওয়েটজ্যান্ডলার

সি # 3.0 পরে আপনি ব্যবহার করতে পারেন varপ্রকাশক টাইপ করার পরিবর্তে, বা প্রকাশক টাইপ যাব বর্জন করতে পারেন new Dictio...- stackoverflow.com/questions/5678216/...
drzaus

4
@ ডিআরজাউস: ভার ব্যবহার করা কুৎসিত, কুৎসিত অনুশীলন যদিও; সি # একটি দৃ strongly়ভাবে টাইপ করা ভাষা।
নাইয়ারগডস

4
@ নাইয়ারগডস: কি? varআক্ষরিকভাবে কেবল কী-স্ট্রোকগুলি সংরক্ষণ করে, এটি স্পষ্টভাবে দৃ strongly়ভাবে টাইপ করা হয়
ড্রজাউস

4
@ নাইয়ারগডস - আপনি আপনার মতামতের অধিকারী, আমার ধারণা, তবে আপনি যদি তাত্ক্ষণিকভাবে আপনার ভেরিয়েবলগুলি আরম্ভ করেন তবে varনিজেকে ব্যবহার এবং পুনরাবৃত্তি করার মধ্যে আক্ষরিক কোনও পার্থক্য নেই SomeType obj = new SomeType...। এবং যেহেতু আপনি var obj;তাত্ক্ষণিকভাবে আরম্ভ না করে ঘোষণা করতে পারবেন না , আমি সমস্যাটি দেখতে পাচ্ছি না। সত্যিই, আমি শেখার চেষ্টা করছি, তবে আমি আপনার অবস্থানটি ছাঁটাইতে পারি না।
ড্রজাউস

36

বাক্য গঠনটি কিছুটা আলাদা:

Dictionary<int, string> names = new Dictionary<int, string>()
{
    { 1, "Adam" },
    { 2, "Bart" }
}

মনে রাখবেন যে আপনি কার্যকরভাবে মানগুলির দ্বিগুণ যুক্ত করছেন।

একটি সাইডেনোট হিসাবে: সংগ্রহের সূচনাতে আর্গুমেন্টগুলি থাকে যা মূলত যুক্ত ( সংকলন) টাইপের ধরণের যুক্তির সাথে সম্মতিযুক্ত যে কোনও যুক্ত () ফাংশনটি কাজে আসে to এটি হ'ল, যদি আমার একটি সংগ্রহ থাকে:

class FooCollection : IEnumerable
{
    public void Add(int i) ...

    public void Add(string s) ...

    public void Add(double d) ...
}

নিম্নলিখিত কোডটি পুরোপুরি আইনী:

var foos = new FooCollection() { 1, 2, 3.14, "Hello, world!" };

দুর্দান্ত উত্তর, আমি সে সম্পর্কে জানতাম না! যাইহোক, অভিধান আরম্ভকারী কখন কাজ করে? এটি কি কেবল <টি কে, টিভিয়াল> সাবক্লাসের জন্য বা আইকোলিকেশন <কীভ্যালিউপায়ার <টি কে, টিভিয়ালিউ >> >> এ কাজ করবে?
শিমি ওয়েটজ্যান্ডলার

কিছু @Shimmy সংগ্রহ initializers কাজ কার্যকরী যে IEnumerable এবং হয়েছে Add()পদ্ধতি।
আন্তন গোগোলেভ

@ শিমি: অভিধানগুলি সংগ্রহসমূহ
জন স্যান্ডার্স

@ জনসন্ডার্স তবে অভিধানের সূচনাদাতা দুটি পরামিতি গ্রহণ করে Add
শিমি ওয়েইজহ্যান্ডলার

4
@ শিম্মি: ব্যাপারটা কেন? মুল বক্তব্যটি এটি কার্যকর করে এমন কোনও শ্রেণীর সাথে কাজ করবে IEnumerable<T>এবং যার একটি Addপদ্ধতি রয়েছে। যদি Addপদ্ধতিটিতে 3 টি প্যারামিটার লাগে তবে আপনার বন্ধনীগুলিতে 3 টি অবজেক্টের প্রয়োজন হবে।
জন স্যান্ডার্স


10

প্রশ্নটি ট্যাগ করা হয়েছে c#-3.0, তবে সম্পূর্ণতার জন্য আমি ভিজুয়াল স্টুডিও 2015 (বা মনো 4.0) ব্যবহার করার ক্ষেত্রে সি # 6 এর সাথে উপলব্ধ নতুন সিনট্যাক্সটি উল্লেখ করব:

var dictionary = new Dictionary<int, string>
{
   [1] = "Adam",
   [2] = "Bart",
   [3] = "Charlie"
};

দ্রষ্টব্য: অন্যান্য উত্তরে উল্লিখিত পুরাতন বাক্য গঠনটি এখনও কাজ করে, যদি আপনি এটি আরও ভাল পছন্দ করেন। আবার, সম্পূর্ণতার জন্য, এখানে পুরানো বাক্য গঠন:

var dictionary = new Dictionary<int, string>
{
   { 1, "Adam" },
   { 2, "Bart" },
   { 3, "Charlie" }
};

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

var dictionary = new Dictionary<int, string>
{
   [1] = "Adam",
   [2] = "Bart",
   [3] = "Charlie",
};

5

আপনি যদি কিছুটা কম ভার্বোজ সিনট্যাক্সের সন্ধান করে থাকেন তবে আপনি এর Dictionary<string, object>(বা আপনার ধরণের যাই হোক না কেন) এর একটি সাবক্লাস তৈরি করতে পারেন :

public class DebugKeyValueDict : Dictionary<string, object>
{

}

তারপরে ঠিক এভাবে আরম্ভ করুন

var debugValues = new DebugKeyValueDict
                  {
                       { "Billing Address", billingAddress }, 
                       { "CC Last 4", card.GetLast4Digits() },
                       { "Response.Success", updateResponse.Success }
                  });

যা সমান

var debugValues = new Dictionary<string, object>
                  {
                       { "Billing Address", billingAddress }, 
                       { "CC Last 4", card.GetLast4Digits() },
                       { "Response.Success", updateResponse.Success }
                  });

আপনি যে সমস্ত কম্পাইল টাইপ করতে চান তা যেমন আপনি বলতে সক্ষম হচ্ছেন তত সুবিধা

is DebugKeyValueDict পরিবর্তে is IDictionary<string, object>

বা পরবর্তী তারিখে কী বা মানের প্রকার পরিবর্তন করা। আপনি যদি রেজার সিএসটিএমএল পৃষ্ঠায় এরকম কিছু করে থাকেন তবে এটি দেখতে খুব সুন্দর।

কম ভার্বোজ হওয়ার পাশাপাশি আপনি অবশ্যই যা চান তার জন্য এই ক্লাসে অতিরিক্ত পদ্ধতি যুক্ত করতে পারেন।


- এই মূলত কিভাবে ViewDataDictionary MVC কাজ করে stackoverflow.com/questions/607985/...
Simon_Weaver

আমি অভিধান এবং টাইপ করা অ্যারেগুলির জন্য 'এলিয়াস' হিসাবে প্রকারের সাথে পরীক্ষা-নিরীক্ষা করেছি, এটি নির্ধারণ করা হয়েছে যে এটি টাইপ করা বিশ্বে নিরাপদ হবে পূর্বনির্ধারিত প্রকারগুলি ব্যবহার করার জন্য .. যখন জেনারিকস এবং লিনাকের বিষয়টি আসে তখন তেমন দরকারী না হতে পারে।
প্যাট্রিক

1

নিম্নলিখিত কোড উদাহরণে, একটি Dictionary<TKey, TValue>টাইপের উদাহরণ দিয়ে শুরু করা হয় StudentName

  Dictionary<int, StudentName> students = new Dictionary<int, StudentName>()
  {
      { 111, new StudentName {FirstName="Sachin", LastName="Karnik", ID=211}},
      { 112, new StudentName {FirstName="Dina", LastName="Salimzianova", ID=317}},
      { 113, new StudentName {FirstName="Andy", LastName="Ruth", ID=198}}
  };

এমএসডিএন থেকে


-3

হ্যাঁ আমরা অভিধানে সংগ্রহ সূচনা ব্যবহার করতে পারি weআমাদের কাছে যদি এর মতো অভিধান থাকে-

Dictionary<int,string> dict = new Dictionary<int,string>();  
            dict.Add(1,"Mohan");  
            dict.Add(2, "Kishor");  
            dict.Add(3, "Pankaj");  
            dict.Add(4, "Jeetu");

আমরা নিম্নলিখিত হিসাবে এটি সূচনা করতে পারেন।

Dictionary<int,string> dict = new Dictionary<int,string>  
            {  

                {1,"Mohan" },  
                {2,"Kishor" },  
                {3,"Pankaj" },  
                {4,"Jeetu" }  

            }; 

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