23

IEnumerable を持っているだけでは不十分な状況に遭遇することがよくあります。ただし、上記のメソッド呼び出しのパフォーマンスについてはわかりません。

私が本当に聞きたいのは:

ToList/ToArray のパフォーマンスは次のとおりです。

  1. IEnumerable を新しい配列/リストにコピーする O(n) 操作?
  2. リストで linq 拡張メソッドを呼び出した場合、ToList を呼び出すと O(1) のパフォーマンスが得られますが、ToArray を呼び出すと O(n) になります (元のリストが配列の場合は逆になります)。

  3. いくつかの魔法が起こり、パフォーマンスは O(1) ですか?

おそらく辞書にはO(n)ですよね?

4

1 に答える 1

49

のパフォーマンスはToList/を新しい配列 / リストにToArrayコピーする O(n) 操作ですか?IEnumerable

はい。ToList最初に内部バッファーを適切な長さにトリミングする必要がないため、わずかに効率的です。

リストでlinq拡張メソッドを呼び出した場合、ToListを呼び出すとO(1)のパフォーマンスが得られますが、ToArrayを呼び出すとO(n)になります(元のリストが配列の場合は逆になります)?

いいえ。どちらの呼び出しでも、常に新しいコレクションが作成されます。これは元のコレクションの浅いコピーです。ただし、コレクションの場合、長さが開始することがわかっているため、実装されていない単純なものよりもToListorToArrayを呼び出す方が効率的です。(ただし、これは実行時に検出されます。コンパイル時の型について心配する必要はありません。)ICollection<T>IEnumerable<T>ICollection<T>

おそらく辞書にはO(n)ですよね?

ハッシュが適切であると仮定すると、それは O(N) です。基本的に、おそらく期待どおりの方法で新しい辞書を作成します。

私の Edulinq ブログ シリーズの対応する投稿をお読みになることをお勧めします。

于 2013-02-23T15:19:11.523 に答える