关于c#:寻找具有1对1唯一依赖关系的数据结构

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
var myCollection = new GenericKeyedCollection<String, Car>(c=>c.Model);
myCollection.Add(new Car("Ford","Mustang"));
var byIndex = myCollection[0];
var byModel = myCollection["Mustang"];

唯一要注意的是,派生属性("key")在添加项之后不能更改。

如果密钥不是该值的属性,则可以使用Tuple将密钥和值组合在一起:

1
2
3
4
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;


这个方法能满足你的需要吗?

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


DictionaryIDictionary接口是我能想到的最接近你想要的。它没有那么简单的搜索操作,因为在一个值上搜索可以返回该键,但是我知道你可以在一个键上搜索以获得一个值。在自定义扩展类中为Reverse提供功能一点也不困难。

msdn idictionary页