Вы можете сделать это довольно легко с циклом:
int c = 0;
for (int i = 0; i < myArray.Length; i++)
{
c = (myArray[i] == 1) ? c + 1 : 0;
if (c >= 10)
{
// do stuff
}
}
Вот еще один способ с помощью Linq:
var indexes =
from i in Enumerable.Range(0, myArray.Length - 10)
where myArray.Skip(i).Take(10).All(x => x == 1)
select i;
foreach(var i in indexes)
{
// do stuff
}
Это возвращает все индексы myArray
где элемент по этому индексу а элементы, следующие 9 индексов, равны 1. Однако этот метод несколько менее эффективен, чем простой цикл for, поскольку он потенциально проверяет каждый элемент более одного раза.
Если вы предпочитаете свободно синтаксис:
var indexes = Enumerable.Range(0, myArray.Length - 10)
.Where(i => myArray.Skip(i).Take(10).All(x => x == 1));
foreach(var i in indexes)
{
// do stuff
}
Если вы хотите иметь быстрое время поиска без прокрутки, возможно, закодировать информацию в вашем массиве из get-go. Вместо сохранения массива с '1' и' 0', сохраните его как набор объектов 'Sequence', которые имеют такие свойства, как' Value' (которые будут хранить '1' или' 0') и 'Length' (что укажите, сколько из этого значения дублируется в строке). Тогда было бы гораздо быстрее перепрыгнуть через ваш массив, по одной полной последовательности за раз. Можно даже поместить эти последовательности в упорядоченную таблицу поиска (возможно, по 'Length'). –