私はスタイリングとパフォーマンスについて考えています。以前は次のように書いていました。
var strings = new List<string> { "a", "b", "c" };
var ints = new List<int> { 1, 2, 3};
でも今はこのスタイルの方が好きになりました
var strings = new [] { "a", "b", "c" }.ToList();
var ints = new [] { 1, 2, 3}.ToList();
私は 2 番目のスタイルを好みますが、今考えてみると、そのように記述する価値は本当にあるのでしょうか、それともそれほど効率的ではなく、より多くの操作が必要になるのでしょうか?
ベストアンサー1
私はダリンに同意しません。彼らはないパフォーマンスの点では同等です。後者のバージョンでは新しい配列を作成し、ToList
それを新しいリストにコピーする必要があります。コレクション初期化子のバージョンは次のものと同等です。
var tmp = new List<int>();
tmp.Add(1);
tmp.Add(2);
tmp.Add(3);
var ints = tmp;
リストが十分な大きさのバッファで始まると仮定すると、それ以上の割り当ては必要ありませんが、意思いくつかのメソッド呼び出しを伴います。これを非常に長く行うと大きいアイテムの数が多い場合は、もっとToList
アイテムがコピーされるので、バージョンよりも割り当てが少なくなります。
パフォーマンスの違いは無視できるほど小さいが、ゼロではない(そして明らかにどちらの方向でも優れています (配列バージョンでは呼び出しが少なくなりますが、割り当ては多くなります)。
違いが重要だと疑う理由がない限り、パフォーマンスよりもスタイルに焦点を当てます。その場合は、測定ただ推測するのではなく。
個人的には最初の形式の方が好みです。最初からリストを使用していることが明確になると思います。別の方法としては、独自の静的クラスを書くことです。
public static class Lists
{
public static List<T> Of<T>(T item0)
{
return new List<T> { item0 };
}
public static List<T> Of<T>(T item0, T item1)
{
return new List<T> { item0, item1 };
}
public static List<T> Of<T>(T item0, T item1, T item2)
{
return new List<T> { item0, item1, item2 };
}
... as many times as you really care about, then ...
public static List<T> Of<T>(params T[] items)
{
return items.ToList();
}
}
次のように記述できます。
var ints = Lists.Of(1);
var ints = Lists.Of(1, 2, 3);
var ints = Lists.Of(1, 2, 3, 5, 6, 7, 8); // Use the params version
これにより、リストを使用していることが明確になりますが、型推論が活用されます。
ただし、やりすぎだと思うかもしれません :)