关于c#:查找/反向查找表是否有内置类型?

Is there a built in type for a lookup/reverse lookup table?

本问题已经有最佳答案,请猛点这里访问。

我正在尝试实现波特字符编码。现在,我使用的是两个字典,它们只是彼此的镜像:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Dictionary<char, int> Lookup = new Dictionary<char, int> {
    { ' ', 0x100100 },
    { '-', 0x011000 },
    { '/', 0x010111 },
    { '0', 0x001101 },
    { '1', 0x011101 },
    ...
};

Dictionary<int, char> Reverse = new Dictionary<int, char> {
    { 0x100100, ' ' },
    { 0x011000, '-' },
    { 0x010111, '/' },
    { 0x001101, '0' },
    { 0x011101, '1' },
    ...
};

是否有内置类型可以处理此问题?比如:

1
2
3
var lookup = new Lookup<int, char>();
lookup.GetByKey(0x100100);
lookup.GetByValue('c');

当我搜索"反向查找"或"查找表"时,找不到任何内容,所有内容似乎都与dns或linqtosql相关。

(我用的是波多特,因为它对一些搜救卫星设备是必要的)


我想你需要一本Bi-Directional字典。有许多这样的实现可用。不过,我喜欢这个链接中的那个:

江户十一〔一〕号

唯一的先决条件是键和值不应是相同的类型,在您的情况下,这是适用的。


如果是我的话,我就有一个配对列表。

1
2
3
4
5
6
class WhateverPair
{
    int Binary {get;private set;}
    char TheChar {get;private set;}
    public WhateverPair(int b, char c) { Binary = b; TheChar = c; }
}

然后像填第一本字典一样填好你的单子。

1
2
3
List<WhateverPair> encodingtable;
char result = encodingtable.First(x=>x.binary == 0x010010).thechar;
int reverse = encodingtable.FirsT(x=>x.thechar == '1').binary;


我认为没有这样的事…有什么扩展方法吗?使用以下方法创建第一个词典,然后创建第二个词典。有了两个字典,您就有了两个哈希表,并且您的访问权限总是O(1)。

1
2
3
4
5
6
7
8
9
10
11
12
13
public static class DictionaryExtensions
{
    public static IDictionary<U, T> Reverse<T, U>(this IDictionary<T, U> dictionary)
    {
        var result = new Dictionary<U, T>();
        foreach(var x in dictionary)
        {
            result[x.Value] = x.Key;
        }

        return result;
    }
}