可能重复:
C# 中的双向 1 到 1 字典
我很好奇标准.net库中是否存在可以表示1-1关系的数据结构,例如以下
1-a
4-b
6-c
5-d
我可以在哪里说:
thisstructure[1] // returns "a"
thisstructure.GetKey["d"] // return 5
我知道所有键都必须是唯一的,是否存在类似的东西?
谢谢!
可能重复:
C# 中的双向 1 到 1 字典
我很好奇标准.net库中是否存在可以表示1-1关系的数据结构,例如以下
1-a
4-b
6-c
5-d
我可以在哪里说:
thisstructure[1] // returns "a"
thisstructure.GetKey["d"] // return 5
我知道所有键都必须是唯一的,是否存在类似的东西?
谢谢!
是的 - 它被称为KeyedCollection。它旨在被子类化并提供索引访问以及通过从添加的项目派生的属性进行的访问。我通常做一个通用的子类:
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);
}
}
要使用它:
var myCollection = new GenericKeyedCollection<String, Car>(c=>c.Model);
myCollection.Add(new Car("Ford", "Mustang"));
var byIndex = myCollection[0];
var byModel = myCollection["Mustang"];
唯一需要注意的是,在添加项目后,派生属性(“键”)不得更改。
如果您的键不是值的属性,那么您可以使用 aTuple<T1, T2>
来组合键和值:
var myCollection = new GenericKeyedCollection<String, Tuple<String, Car>>(t=>t.Item1);
myCollection.Add(new Tuple<String, Car>("Foo", Car("Ford", "Mustang")));
var byIndexCar = myCollection[0].Item2;
var byItem1Car = myCollection["Foo"].Item2;
Dictionary
....orIDictionary
界面是我能想到的最接近您想要的界面。它没有那么简单的搜索操作,因为搜索值可以返回键,但我知道您可以搜索键来获取值。在自定义扩展类中提供反向功能一点也不难。
这种方法能满足您的需求吗?
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];
}
}
然后你可以像这样使用它:
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