Список двухсторонних сопоставлений

#c# #mapping

#c# #сопоставление

Вопрос:

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

Комментарии:

1. Вы хотите сохранить 2 разных типа в одной коллекции?

2. Да, это именно то, что я хочу сделать!

Ответ №1:

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

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

Комментарии:

1. Очень хорошо, если предположить, что L amp; R не являются одним и тем же типом и всегда существует отношение 1 к 1.

Ответ №2:

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

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

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