2011-11-12 115 views
5

我需要將2個值保存在一個列表中,以便將所有位置和我的控制板放在一個列表中。 我正在使用字典,但我發現只有一種方法映射。 除了二維數組之外,有沒有人有任何建議?雙向映射列表

+0

你想在一個集合中存儲2種不同的類型? –

+0

是的,這正是我想要做的! –

回答

6

您可以使用字典很輕鬆地爲雙向映射,如果你不關心的反向映射線性搜索性能(這你會用一個二維數組得到反正):

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

非常好,假設L&R不是同一類型,並且總是存在1對1的關係。 –