是否有内置类型的查找/反向查找表?

时间:2014-03-21 18:32:56

标签: c# .net data-structures

我试图实现Baudot字符编码。现在,我使用的是2个字典,它们只是彼此的镜像:

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' },
    ...
};

是否有内置类型可以处理此问题?类似的东西:

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

当我搜索“反向查找”时,我找不到任何内容。或者查找表&#39;,一切似乎都与DNS或LinqToSql有关。

(我使用Baudot,因为某些Cospas Sarsat设备需要这样做

3 个答案:

答案 0 :(得分:1)

我认为你需要一个Bi-Directional词典。有许多这样的实现可用。我喜欢这个链接中的那个:

http://blogs.microsoft.co.il/blogs/ranw/BDirectional.txt

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

答案 1 :(得分:0)

我认为没有这样的事情...... 一些扩展方法怎么样? 使用以下方法创建第一个字典,然后创建第二个字典。通过使用两个字典,您有两个哈希表,并且您的访问权限始终为O(1)。

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;
    }
}

答案 2 :(得分:0)

如果是我,我只有一对配对列表。

class WhateverPair
{
    int Binary {get;private set;}
    char TheChar {get;private set;}
    public WhateverPair(int b, char c) { Binary = b; TheChar = c; }
}

然后只需填写你的第一本字典即可填写你的清单。

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