即使密钥存在,TryGetValue也会返回false

时间:2017-05-19 14:15:51

标签: c# dictionary unicode

我有一个名为UnicodeMap的模型类,用于表示十六进制unicode值及其辅助和Amharic字符的值。

public sealed class UnicodeMap
    {

        public string Letter;

        public string Consonant;

        public string Vowel;


    }

我已将映射存储在CSV中并在运行时读取以填充字典。

以下是读取和填充字典的代码的摘录:

private Dictionary<string, UnicodeMap> _unicodeMap;

void ReadMap()
{
            var engine = new FileHelperAsyncEngine<UnicodeMap>();

            using (engine.BeginReadFile(MapFile))
            {
                foreach (var record in engine)
                {

                      _unicodeMap.Add(record.Letter, record);
                }
            }
 }

当我尝试使用TryGetValue从字典中获取值时,它总是返回false:

 public void Translate(string text)
    {
            var words = text.Split(' ', '.');
            foreach (var word in words)
            {
                var chr = Char.Parse(word);
                var unicodeStr = @"\u" + ((int) chr).ToString("X4");
                UnicodeMap map;
                if (_unicodeMap.TryGetValue(unicodeStr, out map)) //returns false
                {
                    _animator.SetTrigger(map.Consonant);
                    _animator.SetTrigger(map.Vowel);
                };
            }
    }

例如,当字符串为“ሀ”时, unicodeStr 变量的值为“\ u1200”。我有一个字符串,其值为“\ u1200”,作为字典中的一个键。但是, TryGetValue 似乎无法在字典中找到密钥。

我该如何解决这个问题?可能的原因是什么?

编辑:添加了一个调试器的gif,查看_ unicodeMap 字典的值

Debugger inspecting

1 个答案:

答案 0 :(得分:1)

在gif中看起来有点难,但是在字典键中的文本后面看起来有一个尾随空格,所以你实际上是在比较“\ u1200”和“\ u1200”。

通过在密钥上执行.Trim()来修复填充字典的方式。

private Dictionary<string, UnicodeMap> _unicodeMap;

void ReadMap()
{
        var engine = new FileHelperAsyncEngine<UnicodeMap>();

        using (engine.BeginReadFile(MapFile))
        {
            foreach (var record in engine)
            {

                  _unicodeMap.Add(record.Letter.Trim(), record); //Added .Trim()
            }
        }
}

或修复FileHelperAsyncEngine以不在Letter属性中留下尾随空格。