क्या मैं शब्दकोश <TKey, TValue> प्रविष्टियों के लिए संग्रह आरम्भक का उपयोग कर सकता हूँ?


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" }
};

1
इनिशियलाइज़र कब काम करता है? क्या यह केवल Dictionary<TKey, TValue>उपवर्गों के लिए है या इस पर भी काम करेगा ICollection<KeyValuePair<TKey, TValue>>?
शिम्मी वेइटहैंडलर

C # 3.0 के बाद आप varघोषित प्रकार के बजाय उपयोग कर सकते हैं , या यदि छोड़ने का प्रकार घोषित कर सकते हैं new Dictio...- - stackoverflow.com/questions/5678216/…
drzaus

1
@drzaus: var का उपयोग करना एक बदसूरत, बदसूरत अभ्यास है; C # एक जोरदार टाइप की गई भाषा है।
Nyerguds

1
@ नीरगेट्स: क्या? varवस्तुतः बस आपको कीस्ट्रोक्स बचाता है, यह स्पष्ट रूप से दृढ़ता से टाइप किया गया है
drzaus

4
@Nyerguds - आप अपनी राय के हकदार हैं, मुझे लगता है, लेकिन अगर आप तुरंत अपने चर को शुरू कर रहे हैं तो शाब्दिक रूप से varअपने आप को उपयोग करने और दोहराने के बीच कोई अंतर नहीं है SomeType obj = new SomeType...। और जब से आप var obj;तुरंत शुरू किए बिना घोषित नहीं कर सकते , मैं सिर्फ समस्या नहीं देखता हूं। वास्तव में, मैं सीखने की कोशिश कर रहा हूं, लेकिन मैं आपकी स्थिति को कम नहीं कर सकता।
drzaus

36

वाक्यविन्यास थोड़ा अलग है:

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

ध्यान दें कि आप प्रभावी रूप से मानों को जोड़ रहे हैं।

एक सिडेनोट के रूप में: संग्रह आरंक्षकों में वे तर्क होते हैं जो मूल रूप से जो कुछ भी जोड़ें () फ़ंक्शन के लिए तर्क होते हैं, जो संकलन-प्रकार के तर्क के संबंध में काम में आते हैं। अगर मेरे पास एक संग्रह है:

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!" };

महान जवाब, मुझे इसके बारे में पता नहीं था! वैसे भी, शब्दकोश इनिशियलाइज़र कब काम करता है? क्या यह केवल शब्दकोश <TKey, TValue> उपवर्गों के लिए है या ICollection <KeyValuePair <TKey, TValue >> पर भी काम करेगा?
शिमी वेइटहैंडलर

@ शमी कलेक्शन इनिशियलाइजर्स किसी भी चीज पर काम करते हैं जो लागू करता है IEnumerable और उसके Add()तरीके हैं।
एंटोन गोगोलेव

@ शमी: शब्दकोश संग्रह हैं
जॉन सॉन्डर्स

@ जॉनसनर्स एक शब्दकोश इनिशियलाइज़र के लिए दो मापदंडों को स्वीकार करता है Add
शिमी वेइटहैंडलर

2
@ शमी: वह बात क्यों करता है? मुद्दा यह है कि यह साथ काम करेगा किसी भी वर्ग के जो लागू करता है IEnumerable<T>और जिसकी एक Addविधि है। यदि Addविधि 3 पैरामीटर लेती है , तो आपको ब्रैकेट में 3 ऑब्जेक्ट की आवश्यकता होगी।
जॉन सॉन्डर्स


10

प्रश्न टैग किया गया है c#-3.0, लेकिन पूर्णता के लिए मैं विजुअल स्टूडियो 2015 (या मोनो 4.0) का उपयोग करने के मामले में C # 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>

या बाद की तारीख में कुंजी या मूल्य के प्रकारों को बदलना। यदि आप एक रेजर cshtml पेज के भीतर ऐसा कुछ कर रहे हैं तो यह देखने के लिए बहुत अच्छा है।

कम वर्बोज़ होने के साथ-साथ आप इस वर्ग के लिए अतिरिक्त तरीके जोड़ सकते हैं, जो आप चाहें।


यह मूल रूप से MVC में एक ViewDataDictionary कैसे काम करता है - 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}}
  };

से MSDN


-3

हाँ हम संग्रह आरंभीकरण का उपयोग शब्दकोश में कर सकते हैं। यदि हमारे पास इस तरह का एक शब्दकोष है-

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 वें उत्तर की आवश्यकता नहीं है।
'15:06
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.