Двусторонний картографический список - PullRequest
5 голосов
/ 12 ноября 2011

Мне нужно сохранить 2 значения в одном списке, чтобы у меня были все позиции и элементы управления моей доски в одном списке. Я использовал словарь, но я обнаружил, что есть только один способ отображения. У кого-нибудь есть рекомендации кроме 2-мерного массива?

Ответы [ 2 ]

7 голосов
/ 12 ноября 2011

Это может помочь:

 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>();
6 голосов
/ 12 ноября 2011

Вы можете достаточно легко использовать словарь в качестве двустороннего сопоставления, если вам не нужна производительность линейного поиска для обратного сопоставления (которое вы все равно получите с двумерным массивом):

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

Если скорость поиска является проблемой, вам придется поддерживать два словаря - один для прямого поиска и один для обратного.Или используйте индексируемую базу данных в памяти, такую ​​как SQLite.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...