我需要从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...
答案 0 :(得分:0)
尝试以下检查:
if(!dic.ContainsKey(splitted[0])
dic.Add(splitted[0], splitted[1]);
答案 1 :(得分:0)
由于您没有向我们展示您尝试解析的文件的内容,我们只能猜测。以下是我的猜测(其次是解决方案):
由于字典需要唯一密钥,并且文件可能多次包含相同的密钥,因此每个密钥可以有多个值。因此,更好的数据结构可能是:Dictionary<string, string[]>
。
您可以使用File.ReadLines
或File.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[]>
,只有每个数组的第二个值被选入结果。
BTW:如果您将ReadLines
替换为ReadAllLines
,则会立即读取该文件,然后在处理之前将其关闭。 ReadLines
逐个读取这些行,并在处理过程中保持文件处于打开状态。
答案 2 :(得分:-1)
字典键必须是唯一的
if(!dic.ContainsKey(splitted[0]))
dic.Add(splitted[0], splitted[1]); //ERROR An item with the same key
将阻止错误发生,但可能不是您想要的行为。想想你如何处理重复的密钥(文件的加载失败,只存储你看到的第一个密钥,只存储你看到的最新密钥,如果发生冲突,在密钥名称的末尾附加一个计数器)