2011-11-12 23 views
5

Necesito guardar 2 valores en una lista, así que tengo todas las posiciones Y mis controles de mi placa en una lista. Estaba usando un diccionario pero descubrí que solo hay un mapeo de una manera. ¿Alguien tiene alguna recomendación, excepto una matriz bidimensional?Lista de asignación bidireccional

+0

¿Desea almacenar 2 tipos diferentes en una sola colección? –

+0

¡Eso es exactamente lo que quiero hacer! –

Respuesta

6

Puede utilizar un diccionario con bastante facilidad como una asignación de dos vías si no se preocupan por el rendimiento lineal de búsqueda para el mapeo inverso (que se obtendría con una matriz 2D de todos modos):

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

Si la velocidad de búsqueda es un problema, tendrá que mantener dos diccionarios, uno para la búsqueda directa y otro para el reverso. O use una base de datos indexable en memoria como SQLite.

7

Esto puede ayudar:

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); 
} 

Esto tiene un problema si el lado izquierdo y el lado derecho son del mismo tipo ... es decir, que no funciona bien si se intenta

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

Muy bien asumiendo que L & R no son del mismo tipo y siempre hay una relación de 1 a 1. –