2011-11-12 20 views
5

मुझे एक सूची में 2 मानों को सहेजने की ज़रूरत है, इसलिए मेरे पास एक ही सूची में मेरे सभी बोर्ड और मेरे बोर्ड के नियंत्रण हैं। मैं एक शब्दकोश का उपयोग कर रहा था लेकिन मुझे पता चला कि मैपिंग का एक ही तरीका है। क्या किसी के पास 2-आयामी ऐरे को छोड़कर कोई सिफारिश है?टू-वे मैपिंग सूची

+0

आप एक ही संग्रह में 2 अलग-अलग प्रकारों को स्टोर करना चाहते हैं? –

+0

हां यह वही है जो मैं करना चाहता हूं! –

उत्तर

6

आप एक शब्दकोश आसानी से एक दो तरह से मानचित्रण के रूप में पर्याप्त उपयोग कर सकते हैं अगर आप रैखिक खोज रिवर्स मानचित्रण के लिए प्रदर्शन (जो आप एक 2D सरणी के साथ वैसे भी मिल चाहते हैं) के बारे में परवाह नहीं है:

var dictionary = new Dictionary<string, int>(); 
// Fill it up... 
int forwardMapResult = dictionary["SomeKey"]; 
string reverseMapResult = dictionary.Where(kvp => kvp.Value == 5).First().Key; 

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

7

यह आपकी मदद कर सकते हैं:

public class BiDirectionalDictionary<L, R> 
{ 
    private readonly Dictionary<L, R> leftToRight = new Dictionary<L, R>(); 
    private readonly Dictionary<R, L> rightToLeft = new Dictionary<R, L>(); 
    public void Add(L leftSide, R rightSide) 
    { 
     if (leftToRight.ContainsKey(leftSide) || 
      rightToLeft.ContainsKey(rightSide)) 
      throw new DuplicateNameException(); 
     leftToRight.Add(leftSide, rightSide); 
     rightToLeft.Add(rightSide, leftSide); 
    } 
    public L this[R rightSideKey] 
    { get { return rightToLeft[rightSideKey]; } } 
    public R this[L leftSideKey] 
    { get { return leftToRight[leftSideKey]; } } 
    public bool ContainsKey(L leftSideKey) 
    { return leftToRight.ContainsKey(leftSideKey); } 
    public bool ContainsKey(R rightSideKey) 
    { return rightToLeft.ContainsKey(rightSideKey); } 
} 
[Serializable] 
public class DuplicateNameException : SystemException 
{ 
    protected DuplicateNameException(
      SerializationInfo info, StreamingContext context); 
    public DuplicateNameException(); 
    public DuplicateNameException(string s); 
    public DuplicateNameException(string message, 
      Exception innerException); 
} 

यह एक मुद्दा है, तो बाईं ओर और दाईं ओर एक ही प्रकार के ... यानी, यह काम नहीं करता हैं सही अगर आप कोशिश

var myBiDireDict = new BiDirectionalDictionary<DateTime, DateTime>(); 
+0

बहुत अच्छा मानते हुए एल एंड आर एक ही प्रकार के नहीं हैं और हमेशा 1-से-1 संबंध होता है। –

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