16

キーに依存するディクショナリに値を入れようとしています...たとえば、インデックス 0 のキーのリストに文字「a」があるとします。キー "a" を持つ辞書内のリストにインデックス 0 の val を追加したい (辞書 (キーはインデックス 0 の "a"、インデックス 0 の val) ... 辞書 (キーは "b" のインデックス 2 、インデックス 2 の val))

次のような出力を期待しています。

リストビュー lv1: 1,2,4 リストビュー lv2: 3,5

私が得ているのは、両方のリストビューで 3,4,5 です

List<string> key = new List<string>();
List<long> val = new List<long>();
List<long> tempList = new List<long>();
Dictionary<string, List<long>> testList = new Dictionary<string, List<long>>();

key.Add("a");
key.Add("a");
key.Add("b");
key.Add("a");
key.Add("b");
val.Add(1);
val.Add(2);
val.Add(3);
val.Add(4);
val.Add(5);    

for (int index = 0; index < 5; index++)
{

    if (testList.ContainsKey(key[index]))
    {
        testList[key[index]].Add(val[index]);
    }
    else
    {
        tempList.Clear();
        tempList.Add(val[index]);
        testList.Add(key[index], tempList);
    }
}    
lv1.ItemsSource = testList["a"];
lv2.ItemsSource = testList["b"];

解決:

else コード セクションを次のように置き換えます。

testList.Add(key[index], new List { val[index] });

皆さん、助けてください =)

4

5 に答える 5

24

辞書の両方のキーに同じリストを使用しています

    for (int index = 0; index < 5; index++)
    {
        if (testList.ContainsKey(key[index]))
        {
            testList[k].Add(val[index]);
        }
        else
        {
            testList.Add(key[index], new List<long>{val[index]});
        }
    }

キーが存在しない場合は、新しい List(Of Long) を 1 つ作成し、それに long 値を追加します。

于 2013-02-20T23:28:52.430 に答える
3

を取り除き、句を次のtempListように置き換えます。else

testList.Add(key[index], new List<long> { val[index] });

そして使用しないでくださいContainsTryGetValueはるかに優れています:

for (int index = 0; index < 5; index++)
{
    int k = key[index];
    int v = val[index];
    List<long> items;
    if (testList.TryGetValue(k, out items))
    {
        items.Add(v);
    }
    else
    {
        testList.Add(k, new List<long> { v });
    }
}
于 2013-02-20T23:28:44.080 に答える
1

他のものを次のように置き換えます。

else
{
    tempList.Clear();
    tempList.Add(val[index]);
    testList.Add(key[index], new List<long>(tempList));
}

問題は、両方のキーに TempList への参照を追加していることです。これは同じ参照であるため、最初のキーで置き換えられます。

置き換えられないように新しいリストを作成しています。new List<long>(tempList)

于 2013-02-20T23:27:11.527 に答える
0

宿題のようですが、

for (int index = 0; index < 5; index++)
{
    if (!testList.ContainsKey(key[index]))
        testList.Add(key[index], new List<string> {value[index]});
    else
        testList[key[index]].Add(value[index]);
}

これを読んでください(および他の関連するチュートリアルを読んでください)

于 2013-02-20T23:25:23.840 に答える
0

ここで何をしようとしているのかは完全にはわかりませんが、すべての辞書エントリで同じリストを使用したくないことは保証します.

templist はあなたの問題のスワップtemplist.Clear()ですtemplist = new List<Long>()

または行く

for (int index = 0; index < 5; index++)
{
if (!testList.ContainsKey(key[Index]))
{
testList.Add(key[Index], new List<Long>());
}
testList[key[index]].Add(val[index]);
}
于 2013-02-20T23:31:09.817 に答える