Розмір відео: 1280 X 720853 X 480640 X 360
Показувати елементи керування програвачем
Автоматичне відтворення
Автоповтор
Any()、All()、Aggregate()はゲーム開発ではよく使うLINQで便利です。Anyは(動画内で説明がありましたが)コレクションの中に条件に該当する要素があるかをboolで得られます(e.g. list.Any(e => e.Element == BattleElement.闇)など。)Allはコレクションが全てその条件に当てはまるかどうかをboolで得られます(e.g. enemies.All(e => e.Hp == 0)など。)Aggregateは要素すべての和(SUM)や要素すべての積(PRODUCT)を求めるときに使用します。(e.g. equips.Aggregate((result, e) => result + e.CriticalChance)など。 )
Linq の最後に .ToArray() などをつけてしまうと配列への変換で O(N) の処理時間がかかってしまうので、戻り値であるイテレータを foreach などで舐めて使うほうがよさそうだなと思いました。(そもそも要素数の少ない配列に対しての操作では無視できるレベルの負荷だと思うので気にする必要はなさそうですが)
なぜNが大きい場合にToArray()よりforeachの方が負荷がかからないのか教えて頂きたいです!
@@ジャンゴ-v8i コメント主さんも書かれていますが、ToArray()をすると配列用の領域を確保してコピーする処理時間が発生します。つまり言われていることはforeachが時間がかからないというのではなく、ToArray()を挟んでいることによって処理が間に増えているということです。IEnumerableをそのまま使う: foreachの処理の時間だけでいいToArrayで配列に変換する : 配列に変換する処理の時間 + foreachの処理の時間ということです。ただ、値を返した先でランダムアクセスを行うというのであれば配列にするのは無駄ではありません。
@@ジャンゴ-v8i Linq の最後に .ToArray() を付けると、その時点でイテレータのすべての要素が実際にメモリ上に配列として展開されるため、O(N) の処理時間が発生します。この場合、N はイテレータが生成する要素数を指します。これに対して、Linq のクエリは遅延実行されるため、イテレータ自体は結果を逐次的に生成し、メモリへの展開や要素のコピーが行われません。そのため、foreach を使う場合は、すべての要素が一度にメモリにロードされるわけではなく、要素が一つずつ生成されて処理されます。簡単に言うと、.ToArray() は全要素を一度に展開するため、N が大きい場合にメモリ負荷と処理時間がかかりますが、foreach を使う場合は遅延実行の特性により、負荷が分散されるということです。ただし、N が小さい場合はそのコストは無視できることが多いので、配列が少ない場合には .ToArray() を使っても大きな問題にはならないでしょう。
ありがたい!
めっちゃ便利やぁん...
Any()、All()、Aggregate()はゲーム開発ではよく使うLINQで便利です。
Anyは(動画内で説明がありましたが)コレクションの中に条件に該当する要素があるかをboolで得られます
(e.g. list.Any(e => e.Element == BattleElement.闇)など。)
Allはコレクションが全てその条件に当てはまるかどうかをboolで得られます
(e.g. enemies.All(e => e.Hp == 0)など。)
Aggregateは要素すべての和(SUM)や要素すべての積(PRODUCT)を求めるときに使用します。
(e.g. equips.Aggregate((result, e) => result + e.CriticalChance)など。 )
Linq の最後に .ToArray() などをつけてしまうと配列への変換で O(N) の処理時間がかかってしまうので、
戻り値であるイテレータを foreach などで舐めて使うほうがよさそうだなと思いました。
(そもそも要素数の少ない配列に対しての操作では無視できるレベルの負荷だと思うので気にする必要はなさそうですが)
なぜNが大きい場合にToArray()よりforeachの方が負荷がかからないのか教えて頂きたいです!
@@ジャンゴ-v8i コメント主さんも書かれていますが、ToArray()をすると配列用の領域を確保してコピーする処理時間が発生します。
つまり言われていることはforeachが時間がかからないというのではなく、ToArray()を挟んでいることによって処理が間に増えているということです。
IEnumerableをそのまま使う: foreachの処理の時間だけでいい
ToArrayで配列に変換する : 配列に変換する処理の時間 + foreachの処理の時間
ということです。
ただ、値を返した先でランダムアクセスを行うというのであれば配列にするのは無駄ではありません。
@@ジャンゴ-v8i Linq の最後に .ToArray() を付けると、その時点でイテレータのすべての要素が実際にメモリ上に配列として展開されるため、O(N) の処理時間が発生します。この場合、N はイテレータが生成する要素数を指します。これに対して、Linq のクエリは遅延実行されるため、イテレータ自体は結果を逐次的に生成し、メモリへの展開や要素のコピーが行われません。そのため、foreach を使う場合は、すべての要素が一度にメモリにロードされるわけではなく、要素が一つずつ生成されて処理されます。
簡単に言うと、.ToArray() は全要素を一度に展開するため、N が大きい場合にメモリ負荷と処理時間がかかりますが、foreach を使う場合は遅延実行の特性により、負荷が分散されるということです。
ただし、N が小さい場合はそのコストは無視できることが多いので、配列が少ない場合には .ToArray() を使っても大きな問題にはならないでしょう。
ありがたい!
めっちゃ便利やぁん...