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. LINQ:2つのリストが同じかどうか確認してください
- 2. Haskell:IntがIntのリストにあるかどうか確認してください
- 3. 2つのジェネリックタイプが等しいかどうか確認してください
- 4. Curlドメインがルートかどうか確認してください。
- 5. RunOnUiThreadが必要かどうか確認してください。
- 6. 2つのリストがPythonのタイプで等しいかどうか確認してください
- 7. 変数が 'http'で始まるかどうか確認してください
- 8. 整数値が増加したかどうかを確認しますか?
- 9. ファイルがアップロードされているかどうか確認してください。
- 10. プロセスがアイドリングしているかどうかを確認してください。
- 11. ステータスバーが隠れているかどうかを確認してください
- 12. Django - リストにテンプレートに何かが含まれているかどうか確認してください。
- 13. Ant:2つの数値が等しいかどうか確認してください
- 14. リスト内のLinqからキーワードを確認してください
- 15. structのフィールドがnilであるかどうか確認してください
- 16. 古いfacebookのアクセストークンが有効かどうか確認してください
- 17. ArgParseオプションの引数が設定されているかどうかを確認してください(ジュリアで)
- 18. program_optionsが追加されたかどうか確認してください
- 19. sedコマンドが変更されたかどうか確認してください。
- 20. カラム名が渡されたかどうかを確認してください。
- 21. Plone:フォームが提出されたかどうか確認してください。
- 22. QColorDialogがキャンセルされたかどうかを確認してください。
- 23. オブジェクトがリリースされたかどうかを確認してください。
- 24. マウスクリックが処理されたかどうか確認してください
- 25. テーブルが作成されているかどうかを確認する方法を教えてください。
- 26. 要素がclientHeightにあるかどうか確認してください
- 27. ノード - ディレクトリが存在するかどうかを確認してください
- 28. ポイントがビューポート内にあるかどうか確認してください
- 29. IndexedDBデータベースが存在するかどうか確認してください
- 30. ファイルが(サブ)ディレクトリにあるかどうかを確認してください
@dtb固定していただきありがとうございます... –
+1。私はそれが複数のシーケンスを繰り返し反復することを避けるためにAggregate(ちょっと差をつけてください)でもやってもいいと思っています...後で答えとして書くつもりです... –
@AlexeiLevenkov私の2番目のオプションは一度しか反復しませんが、シーケンスはリストです。私は 'Aggregate'でそれをする方法を見ることができますが、あなたのラムダに厄介な副作用がある場合にのみ... :( –