C#でOrderedDictionaryの指定した位置にキーと値を指定して新しいエントリを挿入する方法
C#のOrderedDictionaryコレクションでは、Insert()メソッドを使うことで、指定したインデックス位置に新しいエントリ(キーと値のペア)を挿入できます。既存の要素の順序を保ちながら、任意の場所に要素を追加したい場合に便利です。
Insert()メソッドの基本構文
Insert()メソッドは、次の3つの引数を受け取ります。
- index:挿入位置を示す0から始まるインデックス
- key:挿入するエントリのキー
- value:挿入するエントリの値
例1:数値キーを使った挿入
以下のコードでは、まず8つの要素を追加し、その後インデックス7の位置に新しいエントリ「15 = Fifteen」を挿入しています。
using System;
using System.Collections;
using System.Collections.Specialized;
public class Demo {
public static void Main(){
OrderedDictionary dict = new OrderedDictionary();
dict.Add("1", "One");
dict.Add("2", "Two");
dict.Add("3", "Three");
dict.Add("4", "Four");
dict.Add("5", "Five");
dict.Add("6", "Six");
dict.Add("7", "Seven");
dict.Add("8", "Eight");
Console.WriteLine("Elements...");
IDictionaryEnumerator demoEnum = dict.GetEnumerator();
while (demoEnum.MoveNext()) {
Console.WriteLine("Key = " + demoEnum.Key + ", Value = " + demoEnum.Value);
}
dict.Insert(7, "15", "Fifteen");
Console.WriteLine("Elements...UPDATED");
demoEnum = dict.GetEnumerator();
while (demoEnum.MoveNext()) {
Console.WriteLine("Key = " + demoEnum.Key + ", Value = " + demoEnum.Value);
}
}
}出力結果
このプログラムを実行すると、次のような出力が得られます。
Elements... Key = 1, Value = One Key = 2, Value = Two Key = 3, Value = Three Key = 4, Value = Four Key = 5, Value = Five Key = 6, Value = Six Key = 7, Value = Seven Key = 8, Value = Eight Elements...UPDATED Key = 1, Value = One Key = 2, Value = Two Key = 3, Value = Three Key = 4, Value = Four Key = 5, Value = Five Key = 6, Value = Six Key = 7, Value = Seven Key = 15, Value = Fifteen Key = 8, Value = Eight
出力を見ると、「15 = Fifteen」がインデックス7の位置、つまり元々「8 = Eight」があった場所より前に挿入され、「8 = Eight」が一つ後ろにずれていることがわかります。
例2:Add()とInsert()を組み合わせた使用例
次の例では、まずAdd()メソッドで末尾に要素を追加し、その後Insert()メソッドで途中の位置に要素を挿入しています。
using System;
using System.Collections;
using System.Collections.Specialized;
public class Demo {
public static void Main(){
OrderedDictionary dict = new OrderedDictionary();
dict.Add("A", "Laptop");
dict.Add("B", "Desktop");
Console.WriteLine("Elements...");
IDictionaryEnumerator demoEnum = dict.GetEnumerator();
while (demoEnum.MoveNext()) {
Console.WriteLine("Key = " + demoEnum.Key + ", Value = " + demoEnum.Value);
}
dict.Add("C", "Ultrabook");
dict.Add("D", "Alienware");
Console.WriteLine("
Elements...UPDATED");
demoEnum = dict.GetEnumerator();
while (demoEnum.MoveNext()) {
Console.WriteLine("Key = " + demoEnum.Key + ", Value = " + demoEnum.Value);
}
dict.Insert(2, "K", "Speakers");
Console.WriteLine("
Elements...UPDATED");
demoEnum = dict.GetEnumerator();
while (demoEnum.MoveNext()) {
Console.WriteLine("Key = " + demoEnum.Key + ", Value = " + demoEnum.Value);
}
}
}出力結果
実行すると、次の出力が得られます。
Elements... Key = A, Value = Laptop Key = B, Value = Desktop Elements...UPDATED Key = A, Value = Laptop Key = B, Value = Desktop Key = C, Value = Ultrabook Key = D, Value = Alienware Elements...UPDATED Key = A, Value = Laptop Key = B, Value = Desktop Key = K, Value = Speakers Key = C, Value = Ultrabook Key = D, Value = Alienware
この例では、dict.Insert(2, "K", "Speakers")によって、インデックス2の位置(3番目)に「K = Speakers」が挿入されています。その結果、それまでインデックス2以降にあった「C = Ultrabook」と「D = Alienware」がそれぞれ一つ後ろに移動しています。
まとめ
OrderedDictionaryのInsert(int index, object key, object value)メソッドを使えば、要素の順序を維持しながら任意の位置に新しいキーと値のペアを挿入できます。Add()メソッドが常に末尾に追加するのに対し、Insert()は挿入位置を自由に指定できる点が大きな違いです。なお、指定したインデックスが範囲外の場合や、同じキーがすでに存在する場合には例外が発生するため、実際のコードでは適切なエラー処理を行うことをおすすめします。
-
C#でのHashtableとDictionaryの使い方徹底解説:基本操作からサンプルコードまで
C#では、キーと値のペアを扱うコレクションとして「Hashtable」と「Dictionary」がよく使われます。どちらもキーを基準に要素へ高速にアクセスできる便利なクラスですが、それぞれ特徴や使い方が異なります。この記事では、両者の主なメソッドと実際のコード例を通じて、基本的な操作方法をわかりやすく解説します。 Hashtable(ハッシュテーブル)とは Hashtable クラスは、キーのハッシュコードに基づいて整理された、キーと値のペアのコレクションを表します。格納された要素には、キーを使ってアクセスします。非ジェネリック型のため、キー・値ともに object 型として扱われる点が
-
Redis GETSETコマンドの使い方 – キーに新しい文字列値を設定し、古い値を取得する方法
このチュートリアルでは、RedisのGETSETコマンドを使って、指定したキーに新しい文字列値を設定すると同時に、古い文字列値を取得する方法を解説します。 GETSETコマンドとは GETSETコマンドは、指定したキーに新しい文字列値を設定し、そのキーに以前保存されていた古い文字列値を返すコマンドです。このコマンドは「値の読み取りと書き込みをアトミック(不可分)に実行したい場合」などに便利で、カウンターのリセットや状態の入れ替え処理などによく使われます。 動作のポイントは以下の通りです。 キーが存在しない場合は (nil) を返します キーは存在するが、保存されている値が文字列型ではない場合