2011-11-12 54 views
5

Tek bir listede 2 değer kaydetmem gerekiyor, böylece tüm konumlar ve kartımın denetimlerim tek bir listede var. Sözlük kullandım, ancak tek bir yol haritasının olduğunu öğrendim. 2-boyutlu bir dizi dışında herhangi bir tavsiyede bulunan var mı?İki Yönlü Eşleme listesi

+0

Tek bir Koleksiyonda 2 farklı Tip saklamak ister misiniz? –

+0

Evet, tam olarak ne yapmak istiyorum! –

cevap

6

Eğer (yine 2B dizi alacağınız) ters haritalama doğrusal arama performansı umurumda değil eğer iki yönlü haritalama gibi kolayca yeterli bir sözlük kullanabilirsiniz:

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

Arama hızı, bir tanesi ileriye doğru arama için, diğeri de geriye doğru olmak üzere iki sözlükte saklamanız gereken bir sorunsa. Veya SQLite gibi bir bellek içi, endekslenebilir veritabanı kullanın.

7

Bu yardımcı olabilir: sol taraf ve sağ taraf aynı tip ... yani çalışmıyor yoksa bu denemek doğru olmadığını bir sorunu var

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'nin aynı türde olmadığını ve her zaman 1'den 1'e kadar bir ilişki olduğunu varsayarsak çok iyi olur. –

İlgili konular