まあ、IEnumerable だけでは不十分な状況に遭遇することは多々あります。ただし、上記のメソッド呼び出しのパフォーマンスについては不明です。
私が本当に聞きたいのは、次のことです。
ToList/ToArrayのパフォーマンスは次のようになります。
- IEnumerable を新しい配列/リストにコピーする O(n) 操作ですか?
リスト上で linq 拡張メソッドを呼び出す場合、ToList を呼び出すとパフォーマンスは O(1) になりますが、ToArray を呼び出すと O(n) になります (元のリストが配列の場合はその逆になります)。
何か魔法が起こってパフォーマンスがO(1)になるのでしょうか?
おそらく辞書作成はO(n)ですよね?
ベストアンサー1
ToList
/のパフォーマンスは、を新しい配列/リストにToArray
コピーする O(n) 操作ですか?IEnumerable
はい。ToList
最初に内部バッファを適切な長さにトリミングする必要がないため、若干効率的です。
リスト上で linq 拡張メソッドを呼び出す場合、ToList を呼び出すとパフォーマンスは O(1) になりますが、ToArray を呼び出すと O(n) になります (元のリストが配列の場合はその逆になります)。
いいえ。どちらの通話でも、新しいコレクションは常に作成されます。これは元のコレクションの浅いコピーです。コレクションの場合は長さが最初からわかっているため、実装していない単純なコレクションよりも、 any でまたはをToList
呼び出す方が効率的です。(ただし、これは実行時に検出されるため、コンパイル時の型を気にする必要はありません。)ToArray
ICollection<T>
IEnumerable<T>
ICollection<T>
おそらく辞書作成はO(n)ですよね?
ハッシュが適切であると仮定すると、それは O(N) です。基本的には、予想どおりに新しい辞書を作成します。
私の Edulinq ブログ シリーズの関連記事もぜひお読みください。