3

インターネットで C# コードのリファクタリングの例をいくつか見つけたところ、この特定のコードに出くわしました。

誰かが私に説明できますMethod2()Method1()?

方法 #1 - 複数の反復を行うIEnumerable<string>

public void Method1()
{
    IEnumerable<string> names = GetNames();

    foreach (var name in names)
    {
        Console.WriteLine("Found " + name);
    }

    var allnames = new StringBuilder();

    foreach (var name in names)
    {
        allnames.Append(name + " ");
    }
}

方法 #2 - 複数の反復を行うList<string>

public void Method2()
{
    IEnumerable<string> names = GetNames();

    var enumerable = names as List<string> ?? names.ToList();

    foreach (var name in enumerable)
    {
        Console.WriteLine("Found " + name);
    }

    var allnames = new StringBuilder();

    foreach (var name in enumerable)
    {
        allnames.Append(name + " ");
    }
}
4

3 に答える 3

4

IEnumerable怠惰な反復を行う可能性があるためです。その場合、反復コードは 2 回実行されます。

たとえば、GetNamesが実際に DB と通信している場合、返されたデータを反復処理するとIEnumerable、実際の SQL クエリが実行される場合があります。その場合、方法 1 では、そのタスクを 2 回実行します。

方法 2 では、 の呼び出しToListによって が 1 回だけ評価さIEnumerableれるため、SQL クエリは 1 回だけ実行されます。

IEnumerable の実際の背後にあるものを常に知っているとは限らないため、列挙を 1 回だけ強制することがベスト プラクティスと見なされることがよくあります。

于 2013-05-30T09:56:40.233 に答える
0

方法 2 は、IEnumerable の複数の列挙が可能なため、優れています。

于 2013-05-30T10:05:22.107 に答える
0

どちらの方法も、その機能に優れています。唯一の差別化要因は、どちらを使用する必要があるかということです。2 番目のメソッドの場合、.ToList() 呼び出しは積極的に式を評価し、IEnumerable コレクションを準備します。最初の方法では、CLR が次のコード ブロックを実行するときにのみ式を評価します。先に述べたように、それはあなたがどのように前進したいかによって異なります。

foreach (var name in names)
于 2013-05-30T10:01:49.337 に答える