1

我在处理这段代码时遇到了麻烦。我是 C# 的新手,但从我到目前为止所做的事情来看,我得出的结论是字典只是引用,实际上并不存储数据?

           foreach (Microsoft.Office.Interop.Excel.Range row in range1.Rows)
            {
                string upc;
                upc = row.Cells[1, 2].Value2;
                list.Add(upc);
                list.Add(row.Cells[1, 3].Value2);
                list.Add("6");


                //add row to dictionary
                dictionary.Add(row.Cells[1, 1].Value2, list);

}

在这个例子中,如果我对 range1 中的每一行保持这个循环,它会将每一行的数据添加到列表中。IE,字典中的最后一项将包含范围内所有行的每个属性。我尝试在每次迭代后清除列表,但是字典报告说没有任何价值,让我相信我必须为每个字典条目创建一个单独的列表?我该怎么做,这是最有效的方法吗?似乎有些不对劲。谢谢!

4

4 回答 4

4

看起来您的代码中只有一个列表,并且对它的引用存储为每个字典键的值。您想在每次循环迭代时创建一个新列表并将其添加到字典中。

于 2012-10-12T00:20:01.277 回答
1

您不太了解的问题List<T>是引用类型。这意味着当您将它存储在某个位置时,无论是类中的属性还是作为 a 中的值Dictionary<TKey,List<T>>,任何更改都会影响保存引用的每个位置中的列表。例如:

List<String> list = new List<String>();
Dictionary<Int32, List<String>> dict = new Dictionary<Int32, List<String>>();

for (int i = 0; i < 3; i++)
{
    list.Add("String" + i);
    dict.Add(i, list);
}

这有点接近你想要做的事情。

但是如果你把输出写出来:

foreach (var kvp in dict)
{
    Console.WriteLine("Key: {0}", kvp.Key);

    foreach (var item in kvp.Value)
    {
        Console.WriteLine("    Value: {0}", item);        
    }
}

如果我正确地阅读了您的期望,我认为您认为会出现以下情况:

Key: 0
    Value: String0
Key: 1
    Value: String0
    Value: String1
Key: 2
    Value: String0
    Value: String1
    Value: String2
Key: 3
    Value: String0
    Value: String1
    Value: String2
    Value: String3

但实际输出是:

Key: 0
    Value: String0
    Value: String1
    Value: String2
    Value: String3
Key: 1
    Value: String0
    Value: String1
    Value: String2
    Value: String3
Key: 2
    Value: String0
    Value: String1
    Value: String2
    Value: String3
Key: 3
    Value: String0
    Value: String1
    Value: String2
    Value: String3

这是因为您正在为每个键添加相同的列表到字典中,并且无论何时进行更改,无论是添加新值还是清除它(使用List.Clear()),您都在更改同一列表的每次出现。

于 2012-10-12T00:40:43.403 回答
0

Dictionary不是参考,但在这种情况下,它包含参考

Lists也不是“引用”,但它们是通过引用访问和操作的。如果您将 a 添加List到某物,则会添加对 that 的引用,List而不是副本。

引用类型通常仅在您明确指定要复制或创建新实例时才被复制。

于 2012-10-12T00:28:15.777 回答
-1

Dictionary<string, List<string>>应该是字典。您的代码应该可以工作。如果字典有键,.Add 将抛出异常。确保字典在循环之外。

于 2012-10-12T00:21:32.673 回答