0

我需要从 csv 获取数据到字典,但是当我尝试编译此代码时,我收到错误“已添加具有相同键的项目”。怎么做 ?`

   Dictionary<string, string> dic = new Dictionary<string, string>();

    public void AddToDic()
     {
         string line = "";
         using (StreamReader sr = new StreamReader(@"words.txt")) 
         {
              while (sr.Peek() != -1)
             {
                 line = line + sr.ReadLine();                
                 string[] splitted = line.Split(' ');
                 dic.Add(splitted[0], splitted[1]);  //ERROR An item with the same key has already been added.        
             }
          }

    }

    //text in words.txt is like: "car auto" newline "water voda" etc...

4

3 回答 3

0

尝试以下检查:

if(!dic.ContainsKey(splitted[0])
    dic.Add(splitted[0], splitted[1]);
于 2013-04-13T16:51:49.490 回答
0

由于您没有向我们显示您尝试解析的文件的内容,我们只能猜测。这是我的猜测(后面是一个解决方案):

  • 文件的每一行包含两个单词
  • 第一个词应该成为字典的键
  • 该文件可能多次包含相同的关键字

由于字典需要唯一的键,并且文件可能多次包含相同的键,因此每个键可以有多个值。所以更好的数据结构可能是:Dictionary<string, string[]>.

您可以使用File.ReadLinesFile.ReadAllLines读取文件的行,然后使用 LINQ 将其转换为字典:

Dictionary<string, string[]> result =
    File.ReadLines("words.txt")
        .Select(line => line.Split(' '))
        .GroupBy(arr => arr[0])
        .ToDictionary(gr => gr.Key,
                      gr => gr.Select(s => s[1]).ToArray());

说明:读取一行后,将其拆分为string[]. 结果按将成为字典键的第一个单词分组。每个组都是一个IEnumerable<string[]>,并且只有每个数组中的第二个值被选择到结果中。

顺便说一句:如果您替换ReadLinesReadAllLines文件将立即读取,然后在处理之前将其关闭。ReadLines逐行读取并在处理过程中保持文件打开。

于 2013-04-13T18:58:46.600 回答
-1

字典键必须是唯一的

if(!dic.ContainsKey(splitted[0]))
   dic.Add(splitted[0], splitted[1]);  //ERROR An item with the same key 

将阻止错误发生,但可能不是您想要的行为。想想你想如何处理重复的键(文件加载失败,只存储你看到的第一个键,只存储你看到的最新的,如果发生冲突,在键名的末尾附加一个计数器)

于 2013-04-13T16:53:39.277 回答