web-dev-qa-db-ja.com

ToList()とデフォルトのリストコンストラクタの使用

Clean Codeのルールを読んだ後、その1つは、あるコレクションから別のコレクションにデータを転送するときにデフォルトのコンストラクターを使用することです。

たとえば、私は持っています:

Dictionary<string, string> dict = new Dictionary<string,string>();

では、パフォーマンスに最適なものは何でしょうか? LINQは効果的ではありませんが、(この特定の状況では)常に既定のコンストラクターを使用するより良い方法であることは知っています。

1. List<string> list = new List(dict.Keys);

または

2. List<string> list = dict.Keys.ToList();
3
NSKBpro

クリーンコードのルールを読んだ後、その1つは、あるコレクションから別のコレクションにデータを転送するときにデフォルトのコンストラクタを使用することです。

デフォルトのコンストラクターは、パラメーターがないか、すべてのパラメーターがデフォルト値を持つコンストラクターです。そう:

_var dict = new Dictionary<string,string>();
_

デフォルトのコンストラクタを使用しています。クリーンなコードアドバイスが、コレクションをあるフォームから別のフォームにコピーするためにそのようなコンストラクターを使用することを示唆している可能性はほとんどありません。

LINQが効果的でないことを知っています

本当に?繰り返しますが、linqは非常に効果的であるため、間違ったWordを使用していると思います。ただし、これが常に最速のアプローチであるとは限らないため、「LINQが常に最速であるとは限らない」ということでしょうか。

では、パフォーマンスに最適なものは何でしょうか?

特定のアプリケーションでこれを決定できるのはあなただけです。 BenchmarkDotNet のようなものを自分でつかみ、2つのアプローチをベンチマークします。

ただし、少し手がかりとして、 ソースコードを確認してください とすると、次のように表示されます。

_var list = dict.Keys.ToList();
_

次のコードを呼び出します。

_public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull(nameof(source));
    }

    return source is IIListProvider<TSource> listProvider 
        ? listProvider.ToList() 
        : new List<TSource>(source);
}
_

(ここに合うように少し再フォーマットされたコード)つまり、単にnew List<TSource>(source)を呼び出します。したがって、linqが遅いと主張するのは、時間をかけて有効性を最初にチェックするのではなく、単純化しすぎて単純化を繰り返す典型的なケースです。

8
David Arno