新しい [] または新しいリスト ? 質問する

新しい [] または新しいリスト ? 質問する

私はスタイリングとパフォーマンスについて考えています。以前は次のように書いていました。

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

これにより、リストを使用していることが明確になりますが、型推論が活用されます。

ただし、やりすぎだと思うかもしれません :)

おすすめ記事