ホーム > .NET Framework | プログラミング > C#で配列の初期値つきの初期化

C#で配列の初期値つきの初期化

C#というか.NET Frameworkって配列に初期値を入れたい時に短い書き方がないよね。
いちいちforループ書くのめんどくさいし。
LINQあたりでうまく書けるのかもしれないけど、トリッキーなのもやだし、自分用ライブラリに初期化用メソッドを入れてみた。

public class k2kArray
{
	public static TElem[] Init<TElem>(TElem[] arr, TElem InitialValue) where TElem : struct
	{
		return Init<TElem>(arr, () => InitialValue);
	}
	public static TElem[] Init<TElem>(TElem[] arr, Func<TElem> InitElem)
	{
		return Init<TElem>(arr, (i) => InitElem());
	}
	public static TElem[] Init<TElem>(TElem[] arr, Func<int, TElem> InitElem)
	{
		int i;
		for (i = 0; i < arr.Length; ++i) arr[i] = InitElem(i);
		return arr;
	}
 
	public static TElem[] CreateInit<TElem>(int Length, TElem InitialValue) where TElem : struct
	{
		return CreateInit<TElem>(Length, () => InitialValue);
	}
	public static TElem[] CreateInit<TElem>(int Length, Func<TElem> InitElem)
	{
		return CreateInit<TElem>(Length, (i) => InitElem());	
	}
	public static TElem[] CreateInit<TElem>(int Length, Func<int, TElem> InitElem)
	{
		return Init<TElem>(new TElem[Length], InitElem);
	}
}

ついでに初期化された配列をnewする関数も。
引数にデリゲートがある関数は参照型用。引数付きコンストラクタが呼びたい気分の時のために作った。
ついでにIndexに依存する初期値を生成するラムダ式を引数に取れたら便利かと思ったのでそれも追加。
使うときはこんな感じ。

byte[] arr1 = k2kArray.CreateInit<byte>( 5, 0xFF );
string[] arr2 = k2kArray.CreateInit<string>( 5, () => "初期値だよ" );
string[] arr3 = k2kArray.CreateInit<string>( 5, (i) => string.Format("{0}番目", i) );

見かけ的には、デリゲートよりnew()制約つけてnewするようにしたほうが良かったかも。余計なこともできるようにするか、シンプルにするか。
ていうかデリゲートだと遅いかな。

結局初期化式はあんまりスマートじゃなくなってしまった。
なんかいい方法ないかな。

コメント:0

コメントフォーム
入力した情報を記憶する

トラックバック:0

この記事のトラックバック URL
http://ka.taoka.info/wp-trackback.php?p=155
トラックバックの送信元リスト
C#で配列の初期値つきの初期化 - ka.taoka.info より

ホーム > .NET Framework | プログラミング > C#で配列の初期値つきの初期化

カレンダー
« 2018 年 7月 »
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
最近の反応
メタ情報

ページの上部に戻る