[解決済み】Linqを使用してコレクションの最後のN個の要素を取得するには?
2022-03-28 10:47:25
質問
あるコレクションが与えられたとき、そのコレクションの最後のN個の要素を取得する方法はありますか? フレームワークにメソッドがない場合、これを行うための拡張メソッドを書くには何がベストでしょうか?
どのように解決するのですか?
collection.Skip(Math.Max(0, collection.Count() - N));
この方法は、ソートに依存することなく項目の順序を維持し、いくつかのLINQプロバイダで幅広い互換性を持っています。
を呼び出さないように注意することが重要です。
Skip
を負の数で指定します。Entity Framework などのプロバイダでは、負の数の引数を指定すると ArgumentException が発生します。への呼び出しは
Math.Max
は、これをうまく回避しています。
以下のクラスは、拡張メソッドに必要なもの、すなわち、静的クラス、静的メソッド、および
this
というキーワードがあります。
public static class MiscExtensions
{
// Ex: collection.TakeLast(5);
public static IEnumerable<T> TakeLast<T>(this IEnumerable<T> source, int N)
{
return source.Skip(Math.Max(0, source.Count() - N));
}
}
パフォーマンスについて簡単にご説明します。
を呼び出すので
Count()
は特定のデータ構造の列挙を引き起こす可能性があり、このアプローチにはデータに対する2つのパスが発生するリスクがあります。実際、リストや配列、そして EF クエリでさえも最適化されたものが存在し、その中で
Count()
の演算をO(1)の時間で実行できる。
しかし、どうしても前方のみの列挙体を使い、2回のパスを避けたい場合は、次のようなワンパス・アルゴリズムを考えてみてください。 ラッセ・V・カールセン または マーク・バイヤー を記述します。これらのアプローチでは、列挙中に一時的なバッファを使用してアイテムを保持し、コレクションの終端が見つかったらそれを返します。
関連
-
[解決済み] LINQを使用してList<T>から要素を削除する
-
[解決済み] ディープクローンオブジェクト
-
[解決済み] 複数の例外を一度にキャッチする?
-
[解決済み] C#でenumからint値を取得する
-
[解決済み] 型チェック:typeof、GetType、is?
-
[解決済み] URLのPath.Combineは?
-
[解決済み] 特定のプロパティに対するLINQのDistinct()
-
[解決済み] リフレクションを使ってジェネリックメソッドを呼び出すにはどうしたらいいですか?
-
[解決済み] LINQのGroup by
-
[解決済み】大文字・小文字を区別しない「Contains(string)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015