C#のOrderedDictionaryの要素を指定したインデックスの配列インスタンスへコピーする方法
C#のOrderedDictionaryクラスには、コレクション内のすべての要素を1次元の配列へコピーできるCopyTo()メソッドが用意されています。このメソッドは、コピー先の配列と、コピーを開始するインデックス(0から始まる位置)を引数として受け取ります。
各要素はDictionaryEntry構造体として配列に格納されるため、コピー先の配列はDictionaryEntry型で宣言する必要があります。以下に具体的なコード例を示します。
例1:基本的な使い方
using System;
using System.Collections;
using System.Collections.Specialized;
public class Demo {
public static void Main(){
OrderedDictionary dict = new OrderedDictionary();
dict.Add(1, "Harry");
dict.Add(2, "Mark");
dict.Add(3, "John");
dict.Add(4, "Jacob");
dict.Add(5, "Tim");
Console.WriteLine("OrderedDictionaryの要素...");
foreach(DictionaryEntry d in dict){
Console.WriteLine(d.Key + " " + d.Value);
}
DictionaryEntry[] dictArr = new DictionaryEntry[dict.Count];
Console.WriteLine("\n配列インスタンスへコピー中...");
dict.CopyTo(dictArr, 0);
for (int i = 0; i < dictArr.Length; i++) {
Console.WriteLine("Key = " + dictArr[i].Key + ", Value = " + dictArr[i].Value);
}
}
}出力結果
上記のコードを実行すると、次のような出力が得られます。
OrderedDictionaryの要素... 1 Harry 2 Mark 3 John 4 Jacob 5 Tim 配列インスタンスへコピー中... Key = 5, Value = Tim Key = 4, Value = Jacob Key = 3, Value = John Key = 2, Value = Mark Key = 1, Value = Harry
この例では、dict.Countと同じサイズの配列を作成し、インデックス0からコピーしています。そのため、OrderedDictionaryの全要素がぴったり配列に収まっています。
例2:配列サイズが要素数より大きい場合
次に、コピー先の配列サイズがOrderedDictionaryの要素数より大きい場合の動作を見てみましょう。
using System;
using System.Collections;
using System.Collections.Specialized;
public class Demo {
public static void Main(){
OrderedDictionary dict = new OrderedDictionary();
dict.Add(1, 10);
dict.Add(2, 20);
Console.WriteLine("OrderedDictionaryの要素...");
foreach(DictionaryEntry d in dict){
Console.WriteLine(d.Key + " " + d.Value);
}
DictionaryEntry[] dictArr = new DictionaryEntry[5];
Console.WriteLine("\n配列インスタンスへコピー中...");
dict.CopyTo(dictArr, 0);
for (int i = 0; i < dictArr.Length; i++) {
Console.WriteLine("Key = " + dictArr[i].Key + ", Value = " + dictArr[i].Value);
}
}
}出力結果
このコードを実行すると、次の出力が生成されます。
OrderedDictionaryの要素... 1 10 2 20 配列インスタンスへコピー中... Key = 2, Value = 20 Key = 1, Value = 10 Key = , Value = Key = , Value = Key = , Value =
ポイントのまとめ
- CopyTo(Array, int index):第1引数にコピー先の配列、第2引数にコピー開始位置のインデックスを指定します。
- 配列サイズが要素数より大きい場合、余った部分は既定値(null)のまま残ります。上記の出力では空のKeyとValueとして表示されています。
- コピー開始インデックスに配列の範囲外の値を指定したり、要素数が残り容量を超える場合は例外がスローされるため注意が必要です。
- OrderedDictionaryは挿入順序を保持するディクショナリですが、内部的な実装によりコピー後の順序が挿入順と異なる場合がある点にも留意してください。
-
C#で配列内に指定した条件に一致する要素が含まれているか確認する方法
C#で配列の中に、特定の条件に一致する要素が1つでも存在するかどうかを確認したい場合があります。そんなときに便利なのが Array.Exists() メソッドです。このメソッドは、第1引数に検索対象の配列、第2引数に条件を表す述語(Predicate)デリゲートを渡します。たとえば文字列の前方一致を調べたい場合は、StartsWith() メソッドと組み合わせることで簡単に実現できます。以下では、具体的なサンプルコードとその実行結果を通じて、使い方を詳しく見ていきましょう。サンプルコード:StartsWith()で前方一致を判定するusing System; public class Demo
-
C#で配列の末尾から指定した数の要素を取得する方法(TakeLastメソッド)
配列の末尾から要素を取得したい場合は、TakeLast() メソッドを使用します。このメソッドは、シーケンスの最後から指定した数の要素だけを取り出し、残りを無視してくれる便利なLINQ拡張メソッドです。まずは、配列を宣言して初期化します。int[] prod = { 110, 290, 340, 540, 456, 698, 765, 789};次に、この配列から末尾の3つの要素を取得してみましょう。IEnumerable<int> units = prod.AsQueryable().TakeLast(3);ここでは、AsQueryable() で配列をクエリ可能な形式に変換し、