Looking for a datastructure with a 1-to-1 unique dependency
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Bidirectional 1 to 1 Dictionary in C#
号
我很好奇标准.NET库中是否存在可以表示1-1关系的数据结构,例如
1 2 3 4 | 1-a 4-b 6-c 5-d |
我可以说:
1 2 | thisstructure[1] // returns"a" thisstructure.GetKey["d"] // return 5 |
号
我知道所有的钥匙都必须是唯一的,有类似的东西吗?
谢谢!
是的-这叫keyedcollection。它将被子类化,并提供索引访问,以及由从添加项派生的属性进行访问。我通常做一个通用的子类:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class GenericKeyedCollection<TKey, TValue> : KeyedCollection<TKey, TValue> { private readonly Func<TValue, TKey> _keyGenerator; public GenericKeyedCollection(Func<TValue, TKey> keyGenerator) { _keyGenerator = keyGenerator; } protected override int GetKeyForItem(TValue item) { return _keyGenerator(item); } } |
要使用它:
1 2 3 4 |
号
唯一要注意的是,派生属性("key")在添加项之后不能更改。
如果密钥不是该值的属性,则可以使用
1 2 3 4 |
这个方法能满足你的需要吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public static class Extensions { public static TKey GetKey<TKey, TValue>(this Dictionary<TKey, TValue> dict, TValue value) { int index = dict.Values.ToList().IndexOf(value); if (index == -1) { return default(TKey); //or maybe throw an exception } return dict.Keys.ToList()[index]; } } |
。
然后您可以这样使用它:
1 2 3 4 5 6 7 | Dictionary<int, char> dict = new Dictionary<int, char>(); dict.Add(1, 'a'); dict.Add(4, 'b'); dict.Add(6, 'c'); dict.Add(5, 'd'); Console.WriteLine(dict.GetKey('d')); //5 |
msdn idictionary页