0

私は持っている

   Dictionary<string, List<string>> Dic = new Dictionary<string, List<string>>();

Dic から最初の 1,2,3 要素を削除する方法。「foreach」での作り方がわかりません

foreach (KeyValuePair<string, List<string>> kvPair in Dic)
            {
                Console.WriteLine(kvPair.Key);
                foreach (string str in kvPair.Value)
                {

                }
            }
4

5 に答える 5

11

ディクショナリから項目 1,2,3 を取得することはできません。キーに基づいてのみ削除できます。

ディクショナリ MSDN

アイテムが返される順序は定義されていません。

Orderbyを使用して、キーに基づいて辞書を並べ替えることができます。ただし、ディクショナリからアイテムを削除するには、キーが必要です。

Dictionary.Removeを参照してください。

編集:「foreach」で編集した質問に基づいて

列挙中に辞書を変更することはできません。foreach でディクショナリからアイテムを削除しようとすると、エラーが発生します。

コレクションが変更されました。列挙操作が実行されない場合があります。

ディクショナリを配列に変換してから、ディクショナリから項目を削除できます (以下のようなものです。改善または変更される可能性があります。これは単なるアイデアです)。

        var dicArrray = Dic.ToArray();
        foreach (KeyValuePair<string, List<string>> kvPair in dicArrray)
        {
            if (kvPair.Key.Equals("1"))
                Dic.Remove(kvPair.Key);
        }

ただし、項目が配列に含まれる順序は定義されていないことに注意してください。あなたはそれについて確信することはできません

于 2012-09-07T05:34:43.410 に答える
1

まず、削除するキーのコレクションを作成します。

var toDelete = new List<string>();
int count = 3;
foreach(var pair in dictionary) {
    toDelete.Add(pair.Key);
    count -= 1;
    if( count==0 ) break;
}

// then when ready - delete
foreach(string key in toDelete) dictionary.Remove(key);

その理由は、列挙中に項目を削除して辞書列挙子を無効にするためではありません。

また、キー ペアが表示される順序は仕様で明示的に設定されていないため、それに依存することはできません。現在は機能していても、フレームワークの次のバージョンでは機能しなくなる可能性があります。したがって、削除する要素のリストを作成する前に、「最初の 3」が何を意味するかを決定する必要もあります。

于 2012-09-07T05:46:02.120 に答える
1

habib が言うように、インデックスに基づいて辞書からアイテムを削除することはできません。キーに基づいてアイテムを削除することしかできません。Remove ()メソッドを使用します。

ここからもっと読む -値に基づいて辞書の項目を削除する

于 2012-09-07T05:37:42.417 に答える
0

ディクショナリ内の項目を削除するには、Remove()メソッドを使用します。例えば:

Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>();
dictionary.Add("1", new List<string());
dictionary.Remove("1");

ディクショナリ要素が追加される順序は維持されません。ただし、たとえば最上位のキーを削除する場合は、次のようにします。

dictionary.Remove(dictionary.Keys.OrderBy().First());
于 2012-09-07T05:34:55.460 に答える
0

dicが「シンプル」な場合Dictionary、LINQ を使用して、元の辞書から新しい辞書を作成しdic、次のように に再割り当てできます。

dic = dic.Skip(3).ToDictionary(kv => kv.Key, kv => kv.Value);

コメントとHabib の回答でastanderが指摘したように、辞書項目の順序は定義されていないため、この手法をSortedDictionaryにのみ適用することをお勧めします。

その場合、SortedDictionaryLINQ の結果から新しいものを作成する必要があります。

dic = new SortedDictionary<string, List<string>>(
          dic.Skip(3).ToDictionary(kv => kv.Key, kv => kv.Value));
于 2012-09-07T06:01:25.713 に答える