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

コードにはリストが1つしかないようで、そのリストへの参照が各辞書キーの値として保存されています。ループの反復ごとに新しいリストを作成し、それをディクショナリに追加します。

于 2012-10-12T00:20:01.277 に答える
1

あなたがよく理解していない問題List<T>は、参照型です。つまり、クラスのプロパティであろうと、 の値で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()List をディクショナリに追加しているためです。新しい値を追加するか、( を使用して) クリアするなど、変更を加えるたびに、同じリストのすべての出現を変更しているためです。

于 2012-10-12T00:40:43.403 に答える
0

Dictionary参照ではありませんが、この場合は参照が含まれています。

Listsも「参照」ではありませんが、参照を介してアクセスおよび操作されます。List何かにa を追加するとList、コピーではなく、その への参照が追加されます。

通常、参照型は、新しいインスタンスをコピーまたは作成することを明示的に指定した場合にのみコピーされます。

于 2012-10-12T00:28:15.777 に答える
-1

Dictionary<string, List<string>> should be the dictionary. Your code should work. If the dictionary has the key, the .Add will throw an exception. Make sure the dictionary is outside of the loop.

于 2012-10-12T00:21:32.673 に答える