Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找/反向查找表是否有内置类型?_C#_.net_Data Structures - Fatal编程技术网

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

C# 查找/反向查找表是否有内置类型?,c#,.net,data-structures,C#,.net,Data Structures,我正在尝试实现一种波多特字符编码。现在,我正在使用两个字典,它们只是彼此的镜像: Dictionary<char, int> Lookup = new Dictionary<char, int> { { ' ', 0x100100 }, { '-', 0x011000 }, { '/', 0x010111 }, { '0', 0x001101 }, { '1', 0x011101 }, ... }; Dictionary&

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

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' },
    ...
};
字典查找=新字典{
{“”,0x100100},
{'-',0x011000},
{'/',0x010111},
{0',0x001101},
{'1',0x011101},
...
};
字典反向=新字典{
{0x100100',},
{0x011000,'-'},
{0x010111,'/'},
{0x001101,'0'},
{0x011101,'1'},
...
};
是否已经有一个内置类型处理此问题?比如:

var lookup = new Lookup<int, char>();
lookup.GetByKey(0x100100);
lookup.GetByValue('c');
var lookup=newlookup();
lookup.GetByKey(0x100100);
GetByValue('c');
当我搜索“反向查找”或“查找表”时,找不到任何内容,所有内容似乎都与DNS或LinqToSql相关


(我使用它是因为它对某些设备是必要的)

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

公共静态类字典扩展
{
公共静态IDictionary Reverse(此IDictionary字典)
{
var result=newdictionary();
foreach(字典中的变量x)
{
结果[x.Value]=x.Key;
}
返回结果;
}
}

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

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;
列表编码表;
char result=encodingtable.First(x=>x.binary==0x010010);
int reverse=encodingtable.FirsT(x=>x.thechar=='1')。二进制;

我想你需要一本双向的字典。有许多这样的实现可用。我喜欢这个链接中的一个:

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


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

字典中是否有一个字符值,用于0和最大int值之间的每一个int值(即,对于int键,它们是稀疏的还是完全填充的)?你说的是这么少的字符,我认为一个简单的数组就足够了。使用int键获取字符的直接索引比任何东西都要快,而且从字符到int的简单线性搜索(即indexOf)可能不会比数组较小时的累积字典开销慢多少。其他解决方案似乎有些过火。@hatchet-Baudot是一种六位编码,因此没有为每个可能的int指定一个值。我还没有真正弄清楚在这种情况下该怎么办。只需使用一个不在Baudot字符集中的sentinel char值来指示未使用的位置。映射了Baudot字符的最小和最大int值是什么?我们不是在谈论一个非常小的集合吗?见鬼,你甚至不需要数组,只要使用一个波特字符的字符串常量,哨兵字符占据序列中的任何孔。是的,它会工作,但效率会更低。我想要两本字典(两个哈希表)。
List<WhateverPair> encodingtable;
char result = encodingtable.First(x=>x.binary == 0x010010).thechar;
int reverse = encodingtable.FirsT(x=>x.thechar == '1').binary;