我需要在一个列表中保存2个值,因此我将所有位置和我的控制板放在一个列表中。 我正在使用词典,但我发现只有一种方式映射。 有没有人有任何建议,除了二维数组?
答案 0 :(得分:7)
这可能有所帮助:
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 :(得分:6)
如果您不关心反向映射的线性搜索性能(无论如何都可以使用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。