【问题标题】:An item with the same key has already been added C#已添加具有相同键的项目 C#
【发布时间】:2017-04-17 12:45:06
【问题描述】:

我正在尝试浏览文件夹中的所有 *.txt 文件以获取其中的元数据。

void SearchAndPopulate(string path, string searchText)
        {

            DirectoryInfo di = new DirectoryInfo(path);
            FileInfo[] files = di.GetFiles("*.txt");
            Dictionary<String, dynamic> dictionary = new Dictionary<String, Object>();
            int i = 0;
            foreach (FileInfo file in files)
            {
                dictionary.Add(String.Format("name{0}", i.ToString()), i);
                using (StreamReader sr = new StreamReader(file.FullName))
                {
                    string content = sr.ReadToEnd().ToLower();
                    if (content.Contains(searchText.ToLower()))
                    {
                               dictionary["name"+i] = File
                            .ReadAllLines(file.FullName)
                            .Select(y => y.Split('='))
                            .Where(y => y.Length > 1)
                            .ToDictionary(y => y[0].Trim(), y => y[1]);
                        var temp = dictionary["name" + i];
                        listBox1.Text = temp["NUM_CLIENT"];

                    }
                }
                i++;
            }


        }

我得到 “已添加具有相同键的项目” 用于字典变量。

【问题讨论】:

  • 您在字典的 foreach 循环中添加 I 的值。兄弟每次都不能加同一个。
  • 据我所知,您首先不需要具有动态类型的字典,因为您只使用带有键 "name" + ii 的项目在最后递增每个循环的。只需为您的 Linq 结果使用局部变量。
  • @Botonomous 与i 不同,因为在循环的末尾有一个i++;
  • 你有多个值的键,所以你需要 Dictionary>
  • 显然是这样。

标签: c# dictionary


【解决方案1】:

当您尝试使用相同的键在字典中添加重复条目时会引发此异常。 Dictionary 中的键值必须是唯一的。

可能的原因

  1. 查看文件内容,您会发现= 符号左侧至少有两行具有相同的字符串值。
  2. 您的文件中= 符号的左侧有多个空值。您可以在 Linq 语句中通过忽略这些行来纠正此问题:

    dictionary["name"+i] = File.ReadAllLines(file.FullName)
        .Select(y => y.Split('='))
        .Where(y => y.Length > 1 && !string.IsNullOrWhiteSpace(y[0]))
        .ToDictionary(y => y[0].Trim(), y => y[1]);
    

【讨论】:

  • 它是 1 或 3。由于i++;,文件每个都是单独处理的
【解决方案2】:

老实说,我认为您的代码中不需要任何字典。您还可以减少在每个文件中读取的次数。

void SearchAndPopulate(string path, string searchText)
{
    DirectoryInfo di = new DirectoryInfo(path);
    FileInfo[] files = di.GetFiles("*.txt");
    foreach (FileInfo file in files)
    {
        var content = File.ReadAllLines(file.FullName);
        if (content.Any(line => line.ToLower().Contains(searchText.ToLower())))
        {
            var numClient = content.Select(y => y.Split('='))
                .Where(y => y.Length > 1 && y[0].Trim() == "NUM_CLIENT")
                .Select(y => y[1])
                .FirstOrDefault();
            if(numClient != null)
                listBox1.Text = numClient;
            else
                // Do something here if "NUM_CLIENT" wasn't in the file.
        }
    }
}

【讨论】:

    猜你喜欢
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多