List コンストラクターに IEnumerable を渡さないでください。IEnumerable には ToList() メソッドがあり、それよりも悪いことはありませんが、より優れた構文 (IMHO) を備えています。
とはいえ、それはあなたの質問への答えを「依存する」に変更するだけです-特に、IEnumerableが実際に舞台裏にあるものに依存します。それがたまたま既に List である場合、ToListは実質的に解放されます。もちろん、それが別の型である場合よりもはるかに高速になります。まだ超高速ではありません。
もちろん、これを解決する最善の方法は、List ではなく IEnumerable で処理を行う方法を見つけようとすることです。それは不可能かもしれません。
編集: コメントの一部の人々は、リストで呼び出されたときに ToList() がそうでない場合よりも実際に高速になるかどうか、および ToList() がリストコンストラクターよりも高速になるかどうかについて議論しています。この時点で、憶測は無意味になるので、ここにいくつかのコードを示します。
using System;
using System.Linq;
using System.Collections.Generic;
public static class ToListTest
{
public static int Main(string[] args)
{
List<int> intlist = new List<int>();
for (int i = 0; i < 1000000; i++)
intlist.Add(i);
IEnumerable<int> intenum = intlist;
for (int i = 0; i < 1000; i++)
{
List<int> foo = intenum.ToList();
}
return 0;
}
}
実際にはリストである IEnumerable を使用してこのコードを実行すると、LinkedList または Stack に置き換えた場合よりも約 6 ~ 10 倍高速になります (Mono 1.2.6 を使用するポーキー 2.4 GHz P4 で)。おそらくこれは、ToList() と LinkedList または Stack の列挙型の特定の実装との間の不運な相互作用が原因である可能性がありますが、少なくともポイントは残ります: 速度は IEnumerable の基になる型に依存します。とはいえ、リストをソースとして使用しても、1000 回の ToList() 呼び出しを行うのに 6 秒かかるため、無料とは言えません。
次の問題は、ToList() が List コンストラクターよりもインテリジェントかどうかです。それに対する答えはノーです。List コンストラクターは ToList() と同じくらい高速です。後から考えると、Jon Skeet の推論は理にかなっています。ToList() が拡張メソッドであることを忘れていました。私はまだ構文的に ToList() を (かなり) 好みますが、それを使用するパフォーマンス上の理由はありません。
したがって、短いバージョンでは、最善の答えは依然として「回避できる場合はリストに変換しないでください」です。それを除けば、実際のパフォーマンスは IEnumerable が実際に何であるかに大きく依存しますが、氷河とは対照的に、せいぜい遅くなります。これを反映するために、元の回答を修正しました。