2011-11-12 23 views
5

2つの値を1つのリストに保存する必要があるため、すべてのポジションと1つのリスト内の自分のコントロールを持っています。 辞書を使用していましたが、一方向のマッピングしかないことがわかりました。 2次元配列以外の推奨事項はありますか?双方向マッピングリスト

+0

あなたは1つのコレクションに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; 

ルックアップの速度が問題となる場合は、前方参照と逆方向の2つの辞書を管理する必要があります。または、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の関係があると仮定すると非常に良いです。 –