morse to text dictionary - System.ArgumentException:已添加具有相同键的项

时间:2014-12-24 00:50:01

标签: c#

正在创建将莫尔斯电码转换为文本和文本到莫尔斯电码的程序。首先,它与字典中的基本字符串工作得很好:abcdefghijklmnoprstuvzy0123456789。我想升级它以翻译我的语言中的特殊字符,如ščťžýáíéôä?!:;。-_()。问题是当我把它写到我的字典并给每个字符时key它会抛出我的excpetion:System.ArgumentException:已经添加了一个具有相同键的项目。

这是我的阅读词典代码

private void ReadDictionary(string filename)

     {
      string cesta = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
        try {
           string[] lines = File.ReadAllLines(filename);
        if (lines != null) {

        }
                   foreach (string line in lines)
                {
                    string[] znaky = line.Split('=');
                    string key = znaky[0];
                    string value = znaky[1];
                    this.morzeovka.Add(key, value);
                    this.latinka.Add(value, key);
                }   
            }
          catch (IOException) {
             MessageBox.Show("Nepodarilo sa nacitat slovnik"+ Environment.NewLine + "Skontrolujete umiestnenie slovníka v:  "+cesta,"Chyba",MessageBoxButtons.OK,MessageBoxIcon.Error);
             System.Environment.Exit(1);
         }      
    }
}

这是我的字典

a=.-
b=-...
c=-.-.
d=-..
e=.
f=..-.
g=--.
h=....
i=..
j=.---
k=-.-
l=.-..
m=--
n=-.
o=---
p=.--.
q=--.-
r=.-.
s=...
t=-
u=..-
v=...-
w=.--
x=-..-
y=-.--
z=--..
1=.----
2=..---
3=...--
4=....-
5=.....
6=-....
7=--...
8=---..
9=----.
0=-----
.=.-.-.-
,=--..--
?=..--..
!=--..-
;=-.-.-.
:=---...
(=--...
)=-.--.-
""=.-..-.
-=-....-
_=..--.-
@=.--.-.
+=.-.-.
/=-..-.
'=.----.
á=.--.-
ä=.-.-
é=..-..
ö=---.
ü=..--
ň=--.--

这是完整的例外

System.ArgumentException: An item with the same key has already been added.
   at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)

感谢您的帮助,

PS:如果我没有发布enought代码,请问我应该添加什么

3 个答案:

答案 0 :(得分:1)

此项目导致问题:

  

N = --.--

在添加密钥之前,您应该包含一个条件来验证密钥是否已经存在于字典中:

if (!morzeovka.ContainsKey(key))
{
    morzeovka.Add(key, value);
}

答案 1 :(得分:1)

这对我有用:

7& (具有相同的代码--...

class Program
{
    static void Main(string[] args)
    {
        var pairsEnum =
             pairs
            .Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
            .Select(x => x.Split('='))
            .Select(x => new { Key = x[0].Trim(), Code = x[1].Trim() });

        var multipleKeys =
            pairsEnum
            .GroupBy(x => x.Key, (key, codes) => new { Key = key, Codes = codes })
            .Where(x => x.Codes.Count() > 1)
            .Select(x => new { Key = x.Key, Codes = x.Codes })
            .ToList();

        var multipleCodes =
          pairsEnum
           .GroupBy(x => x.Code, (code, keys) => new { Code = code, Keys = keys })
           .Where(x => x.Keys.Count() > 1)
           .Select(x => new { Keys = x.Keys, Code = x.Code})
           .ToList();

        var dic1 =
            pairsEnum
            .ToDictionary(x => x.Key, x => x.Code);

        // This will throw the same exception as in your example.
        var dic2 =
            pairsEnum
            .ToDictionary(x => x.Code, x => x.Key);
    }

    private static string pairs =
        @"
        a=.-
        b=-...
        c=-.-.
        d=-..
        e=.
        f=..-.
        g=--.
        h=....
        i=..
        j=.---
        k=-.-
        l=.-..
        m=--
        n=-.
        o=---
        p=.--.
        q=--.-
        r=.-.
        s=...
        t=-
        u=..-
        v=...-
        w=.--
        x=-..-
        y=-.--
        z=--..
        1=.----
        2=..---
        3=...--
        4=....-
        5=.....
        6=-....
        7=--...
        8=---..
        9=----.
        0=-----
        .=.-.-.-
        ,=--..--
        ?=..--..
        !=--..-
        ;=-.-.-.
        :=---...
        (=--...
        )=-.--.-
        """"=.-..-.
        -=-....-
        _=..--.-
        @=.--.-.
        +=.-.-.
        /=-..-.
        '=.----.
        á=.--.-
        ä=.-.-
        é=..-..
        ö=---.
        ü=..--
        ň=--.--";
}

答案 2 :(得分:0)

要了解您的词典来源有什么问题,您可以添加简单的检查:

if (!morzeovka.ContainsKey(key))
{
    morzeovka.Add(key, value);
}
else
{
    Console.WriteLine("morzeovka duplicate: {0}", key);
}
if (!latinka.ContainsKey(value))
{
    latinka.Add(value, key);
}
else
{
    Console.WriteLine("latinka duplicate: {0}", value);
}

它将输出到控制台,复制字典相遇。