リストが与えられた場合、内部の要素の数を決定するのにどの方法が好ましいでしょうか?
var myList = new List<string>();
myList.Count
myList.Count()
Count()
はLINQによって導入された拡張メソッドですが、Count
プロパティはList自体の一部です(ICollection
から派生)。内部的には、LINQはIEnumerable
がICollection
を実装しているかどうかを確認し、実装している場合はCount
プロパティを使用します。したがって、1日の終わりに、List
にどちらを使用しても違いはありません。
私のポイントをさらに証明するために、ここにEnumerable.Count()
のReflectorのコードを示します。
public static int Count<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
ICollection<TSource> is2 = source as ICollection<TSource>;
if (is2 != null)
{
return is2.Count;
}
int num = 0;
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
while (enumerator.MoveNext())
{
num++;
}
}
return num;
}
型の拡張メソッドCount()
よりも、常にCount
およびLength
プロパティを優先します。前者は、それらを含むすべてのタイプのO(1)です。 Count()
拡張メソッドには、O(1)時間でも実行できるタイプチェックの最適化がありますが、基になるコレクションがO(N)に低下します。知っている数少ないタイプの1つではありません。
myList.Countはリストオブジェクトのメソッドであり、フィールドの値を返すだけなので非常に高速です。これは小さな方法であるため、コンパイラ(またはランタイム)によってインライン化される可能性が非常に高いため、コンパイラによって他の最適化が可能になる場合があります。
myList.Count()は、IEnumerabl内のすべてのアイテムをループする拡張メソッド(LINQによって導入された)を呼び出しているため、非常に遅くなります。
ただし(Microsoftの実装では)Count拡張メソッドにはリストの「特殊なケース」があり、リストのCountプロパティを使用できます。つまり、Count()メソッドはCountプロパティよりも少し遅いだけです。
たいていの場合、ほとんどのアプリケーションで速度の違いを知ることができるでしょう。
Listを扱っていることがわかっている場合はCountプロパティを使用し、そうでない場合は「不明な」IEnumerablがある場合は、Count()メソッドを使用して最適化してください。
万が一コレクションのタイプを変更したい場合は、Count()
拡張を使用することをお勧めします。この方法では、コードをリファクタリングする必要がありません(たとえば、Length
を使用するため)。