#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.