2014-10-22 22 views
15

मैं निम्नलिखित कोड के साथ एक त्रुटि मिलती रहती है:तर्क अपवाद "एक ही कुंजी के साथ आइटम पहले से ही जोड़ दिया गया है"

Dictionary<string, string> rct3Features = new Dictionary<string, string>(); 
Dictionary<string, string> rct4Features = new Dictionary<string, string>(); 

foreach (string line in rct3Lines) 
{ 
    string[] items = line.Split(new String[] { " " }, 2, StringSplitOptions.None); 

    rct3Features.Add(items[0], items[1]); 

    ////To print out the dictionary (to see if it works) 
    //foreach (KeyValuePair<string, string> item in rct3Features) 
    //{ 
    // Console.WriteLine(item.Key + " " + item.Value); 
    //} 

} 

त्रुटि कह एक ArgumentException फेंकता है,

"के साथ एक आइटम एक ही कुंजी पहले से ही जोड़ा जा चुका है। "

कई Google खोजों को ठीक करने के बाद मैं अनिश्चित हूं।

कोड मैं एक तुलना समारोह के लिए शब्दकोश का उपयोग करने की जरूरत है बाद में

:

Compare4To3(rct4Features, rct3Features); 

public static void Compare4To3(Dictionary<string, string> dictionaryOne, Dictionary<string, string> dictionaryTwo) 
{ 
    //foreach (string item in dictionaryOne) 
    //{ 

    //To print out the dictionary (to see if it works) 
    foreach (KeyValuePair<string, string> item in dictionaryOne) 
    { 
     Console.WriteLine(item.Key + " " + item.Value); 
    } 

     //if (dictionaryTwo.ContainsKey(dictionaryOne.Keys) 
     //{ 
     // Console.Write("True"); 
     //} 
     //else 
     //{ 
     // Console.Write("False"); 
     //} 
    //} 
} 

इस समारोह पूरा नहीं किया है, लेकिन मैं इस अपवाद को हल करने की कोशिश कर रहा हूँ। इस अपवाद त्रुटि को हल करने के तरीके क्या हैं, और इस फ़ंक्शन के उपयोग के लिए शब्दकोश तक पहुंच रखें? धन्यवाद

+5

एक ही कुंजी के साथ कई आइटम जोड़ने की कोशिश करना बंद करो। शायद यह सुनिश्चित करने के लिए कि कुंजी पहले से मौजूद नहीं है, आपको एक चेक जोड़ना चाहिए। अन्यथा हमारे पास यह जानने का कोई तरीका नहीं है कि कार्रवाई का सही तरीका क्या होगा क्योंकि आपने डुप्लिकेट आइटम होने पर क्या करना चाहते हैं, इसके बारे में लगभग कोई जानकारी नहीं दी है। –

+1

आपके पास डुप्लिकेट कुंजी क्यों हैं? यदि आपको प्रति कुंजी एक से अधिक मान की आवश्यकता है, तो आपको 'शब्दकोश <स्ट्रिंग, सूची > 'का उपयोग करना चाहिए। –

+1

अधिक जानकारी के लिए नीचे मेरा उत्तर देखें, लेकिन आप अपने एड को एक अलग वाक्यविन्यास से बदल सकते हैं। यदि कुंजी पहले से मौजूद है तो निम्न कुंजी के लिए मौजूदा मान को ओवरराइट कर देगा: 'rct3 विशेषताएं [आइटम [0]] = आइटम [1];' –

उत्तर

26

यह त्रुटि काफी आत्म-व्याख्यात्मक है। शब्दकोश कुंजी अद्वितीय हैं और आप एक ही कुंजी में से एक से अधिक नहीं हो सकते हैं। इसे ठीक करने के लिए, आप तो की तरह अपने कोड को संशोधित करना चाहिए:

Dictionary<string, string> rct3Features = new Dictionary<string, string>(); 
Dictionary<string, string> rct4Features = new Dictionary<string, string>(); 

foreach (string line in rct3Lines) 
{ 
    string[] items = line.Split(new String[] { " " }, 2, StringSplitOptions.None); 

    if (!rct3Features.ContainsKey(items[0])) 
    { 
     rct3Features.Add(items[0], items[1]); 
    } 

    ////To print out the dictionary (to see if it works) 
    //foreach (KeyValuePair<string, string> item in rct3Features) 
    //{ 
    // Console.WriteLine(item.Key + " " + item.Value); 
    //} 
} 

यह सरल if बयान सुनिश्चित करता है कि आप केवल शब्दकोश में एक नई प्रविष्टि जोड़ने के लिए जब कुंजी (items[0]) पहले से ही मौजूद नहीं है प्रयास कर रहे हैं।

3

समस्या आप कर रहे हैं समझने के लिए, कुछ कोड को देखो ...

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

test.Add("Key1", "Value1"); // Works fine 
test.Add("Key2", "Value2"); // Works fine 
test.Add("Key1", "Value3"); // Fails because of duplicate key 

कारण एक शब्दकोश एक मुख्य/मान जोड़े है ताकि आप यह कर सकते हैं एक विशेषता है ...

var myString = test["Key2"]; // myString is now Value2. 

तो शब्दकोश था 2 Key2 की, यह है, जो एक वापस जाने के लिए पता नहीं है, तो यह एक अद्वितीय कुंजी के लिए आप को सीमित करता होगा।

1

यदि आप नया जोड़ने का प्रयास करते हैं तो शब्दकोश में पहले से ही एक कुंजी है तो यह अपवाद फेंक दिया जाता है।

उसी शब्द के साथ rct3Lines में एक से अधिक पंक्ति होनी चाहिए। आपके पास एक ही कुंजीपटल में एक ही कुंजी के साथ 2 प्रविष्टियां नहीं हो सकती हैं।

आप आप क्या होने की यदि कुंजी पहले से मौजूद चाहते हैं यह तय करना होगा - अगर आप सिर्फ मूल्य जहां कुंजी मौजूद है तो आप बस

rct3Features[items[0]]=items[1] 

लेकिन, अगर नहीं आप परीक्षण करना चाहते हो सकता है कर सकते हैं अद्यतन करना चाहते

if(rect3Features.ContainsKey(items[0])) 
{ 
    //Do something 
} 
else 
{ 
    //Do something else 
} 
7

के रूप में अन्य लोगों ने कहा है, तो आप एक ही कुंजी एक बार से अधिक जोड़ रहे हैं: कुंजी पहले से मौजूद है। यदि यह मान्य परिदृश्य नहीं है, तो Jdinklage Morgoone का उत्तर जांचें (जो केवल कुंजी के लिए पहले मान को बचाता है), या, इस वर्कअराउंड (जो केवल कुंजी के लिए मिले अंतिम मान को बचाता है) पर विचार करें:

// This will always overwrite the existing value if one is already stored for this key 
rct3Features[items[0]] = items[1]; 

अन्यथा, यदि यह एक कुंजी के लिए एकाधिक मान रखने के लिए मान्य है, तो आपको प्रत्येक string कुंजी के लिए List<string> में अपने मानों को संग्रहीत करने पर विचार करना चाहिए।

उदाहरण के लिए:

var rct3Features = new Dictionary<string, List<string>>(); 
var rct4Features = new Dictionary<string, List<string>>(); 

foreach (string line in rct3Lines) 
{ 
    string[] items = line.Split(new String[] { " " }, 2, StringSplitOptions.None); 

    if (!rct3Features.ContainsKey(items[0])) 
    { 
     // No items for this key have been added, so create a new list 
     // for the value with item[1] as the only item in the list 
     rct3Features.Add(items[0], new List<string> { items[1] }); 
    } 
    else 
    { 
     // This key already exists, so add item[1] to the existing list value 
     rct3Features[items[0]].Add(items[1]); 
    } 
} 

// To display your keys and values (testing) 
foreach (KeyValuePair<string, List<string>> item in rct3Features) 
{ 
    Console.WriteLine("The Key: {0} has values:", item.Key); 
    foreach (string value in item.Value) 
    { 
     Console.WriteLine(" - {0}", value); 
    } 
} 
-2

साफ़ यह करने के लिए किसी भी आइटम जोड़ने से पहले शब्दकोश। मुझे नहीं पता कि एक ऑब्जेक्ट का एक शब्दकोश असाइनमेंट के दौरान किसी अन्य को कैसे प्रभावित करता है लेकिन मुझे एक ही कुंजी, वैल्यू जोड़े के साथ एक और ऑब्जेक्ट बनाने के बाद त्रुटि मिली।

एनबी: यदि आप लूप में आइटम जोड़ने जा रहे हैं तो बस सुनिश्चित करें कि आप लूप में प्रवेश करने से पहले शब्दकोश को साफ़ कर लें।

+3

'नया शब्दकोश () '[एक खाली शब्दकोश देता है] (http://msdn.microsoft.com/en-us/library/x525za90), इसलिए निर्माण के बाद इसे साफ़ करना आवश्यक नहीं है। 'कॉल' * पर प्रत्येक कॉल से पहले इसे साफ़ करना * अपवाद को रोक देगा, लेकिन परिणामस्वरूप केवल अंतिम आइटम शब्दकोश में मौजूद होगा। क्या आप वाकई एक अच्छा सुझाव है? –

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

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