[解決済み] LINQを使用してシーケンス内の最後の要素以外を取得する方法は?
2022-04-27 03:01:18
質問
例えば、ある配列があるとします。
IEnumerable<int> sequence = GetSequenceFromExpensiveSource();
// sequence now contains: 0,1,2,3,...,999999,1000000
シーケンスの取得は安くはなく、動的に生成されるので、一度だけ繰り返し行いたい。
0〜999999を取得したい(つまり、最後の要素以外をすべて取得したい)
というようなことができると認識しています。
sequence.Take(sequence.Count() - 1);
が、これでは大きな配列に対して2つの列挙が発生してしまいます。
LINQの構成で、これを可能にするものはありますか?
sequence.TakeAllButTheLastElement();
解決方法は?
しかし、ジェネレータ(yield return)を使えば、自分で簡単にアルゴリズムをコーディングすることができます。
public static IEnumerable<T> TakeAllButLast<T>(this IEnumerable<T> source) {
var it = source.GetEnumerator();
bool hasRemainingItems = false;
bool isFirst = true;
T item = default(T);
do {
hasRemainingItems = it.MoveNext();
if (hasRemainingItems) {
if (!isFirst) yield return item;
item = it.Current;
isFirst = false;
}
} while (hasRemainingItems);
}
static void Main(string[] args) {
var Seq = Enumerable.Range(1, 10);
Console.WriteLine(string.Join(", ", Seq.Select(x => x.ToString()).ToArray()));
Console.WriteLine(string.Join(", ", Seq.TakeAllButLast().Select(x => x.ToString()).ToArray()));
}
あるいは、一般化されたソリューションとして、最後のn個のアイテムを破棄する(コメントで提案されているようなキューを使用する)。
public static IEnumerable<T> SkipLastN<T>(this IEnumerable<T> source, int n) {
var it = source.GetEnumerator();
bool hasRemainingItems = false;
var cache = new Queue<T>(n + 1);
do {
if (hasRemainingItems = it.MoveNext()) {
cache.Enqueue(it.Current);
if (cache.Count > n)
yield return cache.Dequeue();
}
} while (hasRemainingItems);
}
static void Main(string[] args) {
var Seq = Enumerable.Range(1, 4);
Console.WriteLine(string.Join(", ", Seq.Select(x => x.ToString()).ToArray()));
Console.WriteLine(string.Join(", ", Seq.SkipLastN(3).Select(x => x.ToString()).ToArray()));
}
関連
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み] linqを使用してリスト内の重複を削除する
-
[解決済み] C#を使用して.NETで現在のユーザー名を取得する方法は?
-
[解決済み] LINQを使用してList<string>内のすべての文字列を結合する
-
[解決済み] 月の最終日を知るにはどうしたらいいですか?
-
[解決済み】LINQを使用してコレクション内のすべてのオブジェクトを更新する
-
[解決済み】Linqを使用してコレクションの最後のN個の要素を取得するには?
-
[解決済み] LINQメソッドの実行時の複雑さ(Big-O)にはどのような保証があるのでしょうか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】C# 8は.NET Frameworkをサポートしていますか?