2009-10-28 14 views
5

तो मैं कुछ वस्तुओं के माध्यम से लूपिंग कर रहा हूं और एक शब्दकोश> ऑब्जेक्ट शुरू कर रहा हूं।एक शब्दकोश में आइटम जोड़ें <int, सूची <int>>

तो सबसे पहले मैं अगर कुंजी मौजूद है, अगर यह होता है मैं सूची

ऐसा नहीं होता है, मैं एक नया कुंजी है और नई सूची

पैदा करेगा करने के लिए जोड़ देगा जाँच है कि सही तर्क ?
मैं एक करना होगा:

new List<int>(); 

पहली बार मैं एक आइटम सही डालने?

यानी .:

if(myDic.ContainsKey(car.ID)) 
{ 
     myDic[car.ID].Add(car.MfgID); 
} 
else 
{ 
    myDic.Add(car.ID, new List<int>); 
    myDic[car.ID].Add(car.MfgID); 
} 

उत्तर

19

आपका दृष्टिकोण ठीक काम करता है। यह थोड़ा अक्षम है क्योंकि इसमें दो शब्दकोश लुकअप की आवश्यकता है (Contains के लिए एक और सूची में आइटम जोड़ने के लिए)। आप इसे और अधिक कुशलता से Dictionary.TryGetValue विधि का उपयोग कर सकते हैं:

List<int> list; 
if (!myDic.TryGetValue(car.ID, out list)) 
    myDic.Add(car.ID, list = new List<int>()); 
list.Add(car.MfgId); 

यह सूची को भरने और (आपके मामले में अगर यह संभव है, ज़ाहिर है,) एक ही बार में शब्दकोश में जोड़ने के लिए और अधिक कुशल है।

var list = new List<int> { 1, 9, 8, 9, 1, 8, 1, 2 }; 

तुम भी something like this to map a key to multiple values उपयोग करने पर विचार हो सकता है: सी # 3.0 में, वहाँ एक सुविधा कहते हैं संग्रह initializers आइटम संकलन समय पर जाना जाता है अगर यह आसान एक सूची को भरने के लिए बनाता है।

+0

ग्रेट, अब आप और रीड को केवल दोनों उत्तरों को एक साथ जोड़ना होगा :) –

+0

ओह, और संग्रह प्रारंभकर्ता भी उल्लेखनीय हो सकते हैं। –

+0

@ पावेल: मेरा जवाब रीड के जवाब में उल्लिखित पुनरीक्षण की आवश्यकता को समाप्त करता है। यह हमेशा एक एकल शब्दकोश लुकअप करता है। –

संबंधित मुद्दे