Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新本身就是另一个词典值的词典的值_C# - Fatal编程技术网

C# 更新本身就是另一个词典值的词典的值

C# 更新本身就是另一个词典值的词典的值,c#,C#,我正在开发一个应用程序,其中我想在另一个应用程序中使用字典(我可能使用自定义对象来实现这一点,但我从未使用过字典,所以我想尝试一下)。 实际上我有一本这样的字典: Dictionary<string, Dictionary<string, double>> 字典 稍后,我会将第一个键称为“reference”,将第二个键称为“name”,将双精度键称为“quantity”。 下面是我想用它做的: if the first Dictionary contain key

我正在开发一个应用程序,其中我想在另一个应用程序中使用字典(我可能使用自定义对象来实现这一点,但我从未使用过字典,所以我想尝试一下)。 实际上我有一本这样的字典:

Dictionary<string, Dictionary<string, double>>
字典
稍后,我会将第一个键称为“reference”,将第二个键称为“name”,将双精度键称为“quantity”。
下面是我想用它做的:

if the first Dictionary contain key reference if the value of key reference contain the key name add to the value of key name quantity if there isn't add to the value of key reference a Dictionary which as name as key and quantity as value if there isn't add reference as a key and as value a second Dictionary which as name as key and quantity as value 如果第一个字典包含键引用 如果键引用的值包含键名称 添加到键名数量的值 如果没有 在key reference的值中添加一个字典,其名称为key,数量为value 如果没有 添加引用作为键和值作为第二个字典,其中名称作为键,数量作为值 以下是我实际拥有的:

Dictionary<string, Dictionary<string, double>> firstDictionary = new Dictionary<string, Dictionary<string, double>>();
Dictionary<string, double> buffer = new Dictionary<string, double>();

string reference;
string name;
double quantity;

SQLDataReader reader = myQuery.ExecuteReader();

while(reader.Read())
{
    reference = reader["reference"].ToString();
    name = reader["name"].ToString();
    quantity = Convert.ToDouble(reader["quantity"].ToString().Replace(".", ","));

    if (firstDictionary.ContainsKey(reference))
    {
        if(firstDictionary[reference].ContainsKey(name))
        {
            firstDictionary[reference][name] += quantity;
        }
        else 
        {
            firstDictionary[reference][name] = quantity;
        }
    }
    else
    {
        buffer.Clear();
        buffer.Add(name, quantity);
        firstDictionary[reference] = buffer;                            
    }
}
Dictionary firstDictionary=newdictionary();
字典缓冲区=新字典();
字符串引用;
字符串名;
双倍数量;
SQLDataReader=myQuery.ExecuteReader();
while(reader.Read())
{
reference=reader[“reference”].ToString();
name=reader[“name”].ToString();
quantity=Convert.ToDouble(读卡器[“quantity”].ToString().Replace(“.”,“,”);
if(firstDictionary.ContainsKey(参考))
{
if(firstDictionary[reference].ContainsKey(name))
{
firstDictionary[参考][名称]+=数量;
}
其他的
{
firstDictionary[参考][名称]=数量;
}
}
其他的
{
buffer.Clear();
buffer.Add(名称、数量);
firstDictionary[reference]=缓冲区;
}
}
但我有个问题。我的查询返回是我所期望的,因此没有问题,但我的字典不是。
所有的参考都是应该的,但每个名称和数量都是相同的。当我添加一个新名称时,似乎所有名称都已更改,而当我尝试更新一个名称时,所有数量都设置为相同的值。有鉴于此,我试图改变一些事情,但什么也没有改变。

我猜这是因为另一本词典中的词典,所以:
是否可以使用Dictionary实现我想要的功能?(我知道这不是最好的解决方案)

如果是这样的话,有谁能帮我解决这个问题吗?即使只是一个提示也会很感激。

问题出在您最后的
else
条款中:

else
{
    buffer.Clear();
    buffer.Add(name, quantity);
    listeRef[reference] = buffer;                            
}
这里要做的是清除
缓冲区
,然后添加一个新值,然后将其添加到
listeRef
(我假设这是一个输入错误,应该是
firstDictionary
)。但是您在这里所做的是为
reference
的每个值添加相同的字典。当您将其分配给
firstDictionary
时,您不是在制作副本,而是在存储引用。当您清除
缓冲区时,您正在清除
firstDictionary
中的每个条目所指向的对象。这就是为什么在每个键中都会看到相同的值(可能是最后一个处理的值)

假设你从一个空的
firstDictionary
开始,第一个值是
foo
bar
10
-你最后得到一个
firstDictionary
,看起来像这样:

{
    "foo" : {
        "bar": 10
    }
}
现在,下一个值是
la
far
12
。如果清除了
缓冲区
,结果是:

{
    "foo": {}
}
然后将新值添加到
缓冲区
,得到:

{
    "foo" : {
        "far": 12
    }
}
然后在新的
firstdictionary
键下添加“new”(但实际上是相同的)字典:

{
    "foo" : {
        "far": 12
    },
    "la": {
        "far": 12
    }
}
您需要在else子句中创建一个新词典:

firstDictionary[reference] = new Dictionary<string,double>() { { name, quantity }};
firstDictionary[reference]=newdictionary(){{{name,quantity};

我认为不应该使用字典,也许最好使用自定义对象(如建议的)尝试使用自定义对象。但是如果你仍然想使用字典,你需要在每次迭代中实例化一个新的字典,这将解决你的问题。@JoãoPauloAmorim我知道,但正如我上面所写的,我从来没有使用过字典,所以我想用它(即使它不是最好的解决方案)看看它实际上是如何工作的,以及我以后如何使用它。但是如果我不能用它来做我想做的事情,那么我就要用一个对象。@MatthieuFoltzer
我的查询返回是我所期望的,所以这没有问题,但我的字典不是。
这是什么意思?形状不一样吗?还是价值观不同?还是两者都有?@SoufianeTahiri非常感谢,我刚刚将“buffer.Clear()”改为“buffer=newdictionary()”,效果非常好。我将马特的答案标记为您在评论中回答的答案,但您是第一个给出解决方案的人。非常感谢您的回答,它非常有效。我看起来有点像我以前试过的东西,我很高兴我没走那么远。也要感谢苏菲亚娜·塔希里,她在评论中给出了类似的回答。