列挙がintから継承されている列挙のリストを整数配列にキャストまたはコピーするための最もパフォーマンスの高いソリューションは何でしょうか?
3 に答える
使用している言語を指定していないので、C#を使用していると思います。また、列挙可能ではなく列挙について話していると仮定します。
var array = enums.Select(e => (int)e).ToArray();
List<anything>
一般に、an を配列に「変換」することはできません。リストの内容に基づく値で内容が初期化される新しい配列を作成することができます。これは、元のデータの読み取り専用の「ライブ」ビューを生成する aList<T>
から a への変換などとは異なります。ReadOnlyCollection<T>
後者の状況では、結果の配列は初期化データを提供したオブジェクトに「接続」されたままになり、前者の状況では切り離されるため、この区別は重要です。
メソッドを使用して、列挙型の配列から基になる整数型の配列にデータをコピーできますArray.Copy
。あなたの最善の策はToArray
、 を に変換するために を使用しList<someEnum>
、someEnum[]
それからデータを(または、または適切な型)Array.Copy
にコピーするために を使用することです。これには配列を 2 回コピーする必要がありますが、一般に、配列要素を一括コピーするのに必要な時間は、要素を個別に処理する時間よりもはるかに短くなります。int[]
long[]
最も効率的なのは、for
自分でループを実行することです。
static int[] Array(List<MyEnum> list)
{
var array = new int[list.Count];
for (int i = 0; i < array.Length; i++)
array[i] = (int)list[i];
return array;
}
Cast<T>
の拡張メソッドで全体を短くすることができますSystem.Linq
。それはボクシングを引き起こし、最もパフォーマンスが高くなりません。
var array = list.Cast<int>().ToArray();
Justin's は、読みやすさと速度のトレードオフを考慮した最適なソリューションです。