2013-09-30 7 views
6

मैं एक कुंजी को मान के साथ प्राप्त करने का एक तरीका ढूंढ रहा हूं। हां, मैंने पहले ही खोज फ़ंक्शन का उपयोग किया है, लेकिन अधिकांश उत्तर विपरीत दिशा के लिए हैं (एकाधिक मान प्रति कुंजी), लेकिन मुझे विपरीत चाहिए।सी # शब्दकोश: एकाधिक मूल्य प्रति मान

इसके पीछे तर्क यह है कि मैं प्रति "मुख्य" आईडी के लिए कई आइटम-आईडी (यह एक बॉट के लिए) रखना चाहता हूं, और उन एकाधिक आईडी को एक के मूल्य में फेंकना बहुत धीमा है (एक मूल्य की तलाश करना => सभी मुख्य आईडी & प्रत्येक मान प्राप्त करने के बाद, सभी आईडी को लूपिंग करना, फिर यह जांचना कि क्या आईडी मौजूद है)।

उदाहरण

Key 1 => Value 
Key 2 => Value 
Key 3 => Value 
Key 4 => Value 
Key 5 => Value 2 

के लिए खोज रहे हैं लौटना चाहिए: कुंजी 1-4, नहीं 5

तो मैं एक तरह से तलाश कर रहा हूँ कि आसान करने के लिए - जैसे मैं ऊपर कहा।

कोई भी जानता है कि यह संभव है और इसे कैसे करें? अग्रिम धन्यवाद।

+0

आप एक समग्र कुंजी कर सकते हैं को देखते हुए (यह एक वस्तु हो सकता है आप पता है) लेकिन ऐसी कुंजी से खोज इष्टतम –

+3

से कम होगी क्या आप कुछ परीक्षा दिखा सकते हैं कृपया इनपुट इनपुट/आउटपुट, शायद आप इस डेटा संरचना पर कौन से ऑपरेशन कॉल करना चाहते हैं। – Servy

+1

आप यहां क्या लागू करने की कोशिश कर रहे हैं, बिल्कुल? आपके उदाहरण को देखते हुए जिसे आप 'वैल्यू' कहते हैं वह वास्तव में कुंजी है, और आपके वास्तविक मूल्य को केवल एक संग्रह होना चाहिए। –

उत्तर

2

करें चारों ओर दूसरी तरफ शब्दकोश और मूल्य वस्तुओं की एक सूची बनाते हैं।

अगर उदाहरण Value के लिए एक स्ट्रिंग है और Key 1-4 ints हैं अपने शब्दकोश की तरह कुछ दे सकता है:

var theDictionary = new Dictionary<string, List<int>>(); 

ValuetheDictionary["Value"] द्वारा पुन: प्राप्त करने तो 1, 2, 3 और 4

युक्त ints की एक सूची वापस होगा

संपादित करें - जोड़ा उदाहरण:

var theDictionary = new Dictionary<string, List<string>> 
    { 
     {"Value", new List<string> {"Key 1", "Key 2", "Key 3", "Key 4", "Key 5",}}, 
     {"Value2", new List<string> {"Key 5", "Key 2"}} 
    }; 

var oneToFour = theDictionary["Value"]; 
+0

मुझे लगता है कि यह अभी भी मेरे लिए सबसे आसान संस्करण है। सबको शुक्रीया! – user1818486

5

संपादित करें: अपने संपादित को देखते हुए, यह वास्तव में लगता है कि आप कुंजियों से मेल खाने के लिए इस Dictionary नहीं अपने मूल्यों तैयार की है पीछे की ओर ... अपनी चाबी मिलान मूल्यों के लिए होना चाहिए,।

आप कुछ ऐसा कर सकते हैं जो बाहरी-कुंजी को आंतरिक-कुंजी के लिए नक्शा बनाता है, फिर दूसरी शब्दकोश को इंडेक्स करने के लिए आंतरिक-कुंजी का उपयोग करें।

उदाहरण:

var outer = new Dictionary<int, Guid> { 
    { 1, GuidA }, 
    { 2, GuidA }, 
    { 3, GuidA }, 
    { 4, GuidA }, 
    { 5, GuidB } 
}; 
var inner = new Dictionary<Guid, Value> { 
    { GuidA, Value1 }, 
    { GuidB, Value2 } 
}; 

आप के रूप में इसे का उपयोग होगा: value = outer[inner[key]]

1

1) सर्वो बिल्कुल सही है। यदि आप किसी भी चीज पर एक खोज कर रहे हैं लेकिन एक कुंजी ... और यदि आप कुछ भी प्राप्त करने की कोशिश कर रहे हैं लेकिन संबंधित मान ... तो कुछ निश्चित रूप से गलत है। सभी चीजें बराबर होती हैं, शायद आप एक शब्दकोश नहीं चाहते हैं।

2) आप जो कह रहे हैं उसके आधार पर, शायद एक बेहतर संग्रह प्रकार एक सूची हो सकती है। विशेष रूप से, नाम/मूल्य जोड़े की एक सूची।

उदाहरण:

List<string> NVList = new List<string>(); 
NVList.Add("color=blue"); 
... 

3) ध्यान दें कि नेट एक विशेष "NameValueCollection" वर्ग है कि आप के लिए आदर्श हो सकता है:

3

आप overthinki हो सकता है आपकी समस्या है। लुकअप ऑपरेशंस के लिए उपयोगी होने के लिए कुंजी को अद्वितीय होना चाहिए। मूल्यों को अद्वितीय होने की आवश्यकता नहीं है। एकाधिक कुंजी समस्या के बिना एक ही मूल्य को इंगित कर सकते हैं।

0

आप अपने आरंभिक शब्दकोश (मूल्यों के लिए अपनी चाबी मानचित्रण) है मान लिया जाये कि पहले से ही आप एक रिवर्स शब्दकोश में हाथ से कि रिवर्स शब्दकोश बनाए बिना यह कन्वर्ट करने के लिए कुछ Linq का उपयोग कर सकते हैं।

var newDict = initialDict.Select(x=>x.Value).Distinct().ToDictionary(x=>x, x=> initialDict.Where(kvp=>kvp.Value == x).Select(kvp=>kvp.Key)); 

अपने मूल शब्दकोश से अलग originalValues का चयन करें और अपने newKeys के रूप में उन का उपयोग करें। आपका newValues कि प्रत्येक originalValue/newKey को मैप किया अपने originalKeys के सेट कर रहे हैं।


उदाहरण: https://dotnetfiddle.net/dhwUSC

var initialDict = new Dictionary<int, string>{ 
     {1, "Value"}, 
     {2, "Value"}, 
     {3, "Value"}, 
     {4, "Value"}, 
     {5, "Value2"} 
    }; 

की एक आरंभिक शब्दकोश ऊपर फ़ंक्शन

Value: {1, 2, 3, 4} 
Value2: {5} 
संबंधित मुद्दे