LINQを使って整数のリストが "順次"であるかどうかを確認する方法がありますか?つまり1,2,3,4,5または14,15,16,17 、18?整数のリストが1つ増えるかどうか確認してください
答えて
あなたはEnumerable.Zip経由でこれを行うことができます:
bool sequential = values.Zip(values.Skip(1), (a,b) => (a+1) == b).All(x => x);
をこれは、値の各ペアを取って、第二は、まず、および返すブール値よりも1以上であるかどうかをチェックすることによって動作します。すべてのペアが基準に適合する場合、値は順次です。
が、これは整数の リストであることを考えると、あなたが使用して、より効率的に、わずかにこれを行うことができます。
bool sequential = values.Skip(1).Select((v,i) => v == (values[i]+1)).All(v => v);
これをインデックスのみがアクセスすることができる配列に動作します。 Skip
コールが効果的にインデックスをシフトするので、values[i]
(values[i-1]
ではなく)を使用することに注意してください。
bool isSequential = Enumerable.Range(values.Min(), values.Count())
.SequenceEqual(values);
なぜこれが答えに選ばれなかったのか分かりません。その素晴らしく簡単です。 – user1830285
もう1つのオプションは、Aggregateを使用してシーケンスを1回だけ繰り返すことです。
注条件が失敗したときにリードCopsey Aggregate
によって提案All
とは異なり、途中で止めることはできないということ...
var s = new int[] {3,4,5,6}.ToList();
var isSequential = s.Aggregate
(
new {PrevValue = 0, isFirst = true, Success = true} ,
(acc, current) =>
new {
PrevValue = current,
isFirst = false,
Success = acc.Success && (acc.isFirst || (acc.PrevValue == current - 1))
}
)
.Success;
ファンシーなバージョンが一緒に前の値またはだろう特別なコードを運ぶイテレータを持っているだろう「最初と残り」の反復子を分割することで、任意の列挙型に対して1回の繰り返しでReedのソリューションを実装することができます。
質問がリストに関するものだったので、ToList()を追加しました。私は楽しみの継続を望みます。 –
+1これはうまくいきますが、大きなリストのメモリを大量に消費し、成功したときに短絡することはありません...私はまだ私のオプションのほうが好きです(私の2番目は特に効率的ですそれがリストだと知っている
あなたはすでにあなたがあなたのリストを持っている数字は、ユニークであることを知っている、ともがを並べ替えた場合、シーケンシャルのための最も簡単なチェックだけで
lst[lst.Count - 1] - lst[0] == lst.Count - 1
では、リスト内の少なくとも1つの要素を想定します。
- 1. Laravel:コントローラーでデータが整数かどうか確認してください
- 2. LINQ:2つのリストが同じかどうか確認してください
- 3. 整数が増加しているかどうかを確認するC++
- 4. 数字のうちの1つだけが奇数か、ユーザー入力リストからでも偶数であるかどうかを確認してください。
- 5. Haskell:IntがIntのリストにあるかどうか確認してください
- 6. リンクされたリストが回文かどうか確認してください
- 7. div内のラジオボタンの1つがチェックされているかどうかを確認してください
- 8. 2つのジェネリックタイプが等しいかどうか確認してください
- 9. 文字列のリストが正確にn回見つかったかどうか確認してください
- 10. RunOnUiThreadが必要かどうか確認してください。
- 11. Curlドメインがルートかどうか確認してください。
- 12. DrawableResがVectorDrawableかどうか確認してください
- 13. 2つのjsonが同等かどうかを確認してください
- 14. 変数が 'http'で始まるかどうか確認してください
- 15. 与えられた数字が満足しているかどうかを確認してください
- 16. 2つのリストがPythonのタイプで等しいかどうか確認してください
- 17. ファイルがアップロードされているかどうか確認してください。
- 18. プログラムのリストからプログラムがインストールされているかどうか確認してください。
- 19. 入力がバイナリで、2つの1を含んでいるかどうかを確認してください
- 20. 整数値が増加したかどうかを確認しますか?
- 21. jsonの1つのキーの値に別のキーがあるかどうかを確認してください。
- 22. C++:文字列が "strtol"を使用する有効な整数かどうか確認してください
- 23. プロセスがアイドリングしているかどうかを確認してください。
- 24. flinkがサポートしているかどうかを確認してください。
- 25. リストが別のリストのサブリストであるかどうかを確認してください。
- 26. ステータスバーが隠れているかどうかを確認してください
- 27. Pythonリストに挿入します。まだエントリが存在するかどうか確認してください。
- 28. 30秒〜1分後にユーザーがまだCLRegion内にいるかどうかを確認してください
- 29. テスト:タプルが返されるかどうか確認してください。
- 30. Django - リストにテンプレートに何かが含まれているかどうか確認してください。
@dtb固定していただきありがとうございます... –
+1。私はそれが複数のシーケンスを繰り返し反復することを避けるためにAggregate(ちょっと差をつけてください)でもやってもいいと思っています...後で答えとして書くつもりです... –
@AlexeiLevenkov私の2番目のオプションは一度しか反復しませんが、シーケンスはリストです。私は 'Aggregate'でそれをする方法を見ることができますが、あなたのラムダに厄介な副作用がある場合にのみ... :( –