2013-04-13 84 views
0

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

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... 

+0

这不会是一个编译时错误,这将是一个运行时错误。这意味着在csv文件之前发生了splitted [0],并且您还将其作为关键字。如果您可以向我们展示csv文件,我们将能够为您提供更多帮助。 –

+1

您的文件有一个重复的密钥(例如'汽车汽车',然后某个地方它有汽车,'汽车手册')。你想如何处理重复键? – keyboardP

+0

整个文件请:)(或只是一个显示问题)。另外,因为你在做字典并不意味着你需要的数据结构是一个字典;) –

回答

0

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

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

由于字典需要唯一键并且文件可能多次包含相同的键,因此每个键可能有多个值。所以更好的数据结构可能是: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[]>,并且只有每个数组的第二个值被选入结果中。

顺便说一句:如果您将ReadLines替换为ReadAllLines,则该文件将被立即读取,然后在处理该文件之前它将被关闭。 ReadLines逐行读取这些行,并在处理该文件时保持该文件处于打开状态。

0

尝试以下检查:

if(!dic.ContainsKey(splitted[0]) 
    dic.Add(splitted[0], splitted[1]); 
+1

如果他容忍/允许重复键,那么他选择了错误的数据结构。 – David

-1

字典键必须是唯一的

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

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

+3

对你的评论而不是创建新的答案会更好吗?这导致重复的答案。请考虑一下。 – David