已添加具有相同键的项目C#

时间:2017-04-17 12:45:07

标签: c# dictionary

我试图浏览文件夹中的所有* .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++;
            }


        }

我得到&#34;已经为词典变量添加了具有相同键的项目&#34;

2 个答案:

答案 0 :(得分:4)

当您尝试使用相同的键在Dictionary中添加重复条目时,抛出此异常。 Dictionary中的键值必须是唯一的。

可能的原因

  1. 查看文件的内容,您会发现至少有2行,=符号的左侧具有相同的字符串值。
  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 :(得分:0)

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

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