2011-11-12 14 views
5

Muszę zapisać 2 wartości na jednej liście, więc mam wszystkie pozycje I moje kontrolki mojej tablicy na jednej liście. Użyłem słownika, ale odkryłem, że istnieje tylko jedno mapowanie drogi. Czy ktoś ma jakieś zalecenia poza dwuwymiarową tablicą?Lista odwzorowań dwukierunkowych

+0

Chcesz przechowywać 2 różne typy w jednej kolekcji? –

+0

Tak, właśnie to chcę robić! –

Odpowiedz

6

Można używać słownika dość łatwo jako dwukierunkowy mapowania jeśli nie dbają o liniowym wydajności wyszukiwania dla odwrotnego mapowania (które można dostać z 2D tablicy w każdym razie):

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

Jeśli szybkość wyszukiwania jest problemem, musisz zachować dwa słowniki - jeden do wyszukiwania do przodu, a drugi do odwrotnego. Lub użyj in-memory, indeksowanej bazy danych, takiej jak SQLite.

7

To może pomóc:

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

To ma problemu, jeśli lewa i prawa strona są tego samego typu ... to znaczy, że nie działa w porządku, jeśli spróbujesz

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

Bardzo dobre założenie, że L i R nie są tego samego typu i zawsze istnieje relacja 1: 1. –

Powiązane problemy