为什么这本词典没有保存数据 - C#

时间:2014-11-17 20:09:24

标签: c# dictionary

我有一个日期进入文本文件,形成变量nameSplit。以下代码检查以查看来自文本文件到nameSplit的字符串之前是否已保存到字典中。如果是这样,那么它打印“Hoozah!”,否则它将数据添加到数组并打印“Failure”。但是,如果我在文本文件中输入名称“Jim”5次,它只输出“Failure”,虽然它应该在第二个条目输出“hoozah!”。我不确定是什么问题!

while (!sR.EndOfStream)
{
    string line = sR.ReadLine();
    string split = line.Split('$', ',')[1];
    string nameSplit = line.Split('.', ':')[1];

    Dictionary<string, decimal> names = new Dictionary<string, decimal>();

    // inside the loop

    decimal n = Convert.ToDecimal(split);
    if (names.ContainsKey(nameSplit))
    {
        names[nameSplit] += n;
        names.Add(nameSplit, n);
        Console.WriteLine("Hoozah!");
    }
    else
    {
        names.Add(nameSplit, n);
        Console.WriteLine("Failure");
    }




} sR.Close();
GC.Collect();
Thread.Sleep(66);

DATA:

  1. Jim:22.00美元,2。Jim:2100.00美元,3。Jim:6.00美元,4。Jim:32.00美元,5。Jim:$ 2.00,

1 个答案:

答案 0 :(得分:7)

在循环外定义字典。现在你只是在每个循环上创建一个新的字典,基本上忘记了前一个循环的结果。

Dictionary<string, decimal> names = new Dictionary<string, decimal>();
while (!sR.EndOfStream)
{
    ...
}

修改

根据您的数据,您实际上需要在每一行上拆分“条目”并循环它们。假设存在多行具有相似格式的行,您将需要执行以下操作。

Dictionary<string, decimal> names = new Dictionary<string, decimal>();
while (!sR.EndOfStream)
{
    string line = sR.ReadLine();
    var entries = line.Split(new []{','}, StringSplitOptions.RemoveEmptyEntries);

    foreach(var entry in entries)
    {       
        decimal amount = decimal.Parse(entry.Split('$')[1]);
        string nameSplit = entry.Split('.', ':')[1].Trim(); 

        if (names.ContainsKey(nameSplit))
        {
            names[nameSplit] += amount;
            Console.WriteLine("Hoozah!");
        }
        else
        {
            names.Add(nameSplit, amount);
            Console.WriteLine("Failure");
        }
    }
}

请注意,我重命名了一些变量并从名称中修剪了空格,但主要是分割逗号并迭代每个“条目”。我不确定为什么要保留美元金额的总和,但你可以在循环后使用它们。