我有一些用 1 和 0 填充的数组。有没有简单的方法可以找到,例如,10 个彼此相邻且值为 1 的字段?
类似于: if (array[i ... i+10] = 1) -> 做一些事情?
我知道我可以用for
它来做,但我有一个巨大的多重数组,这将非常有帮助。
您可以使用 for 循环轻松完成此操作:
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
}
如果我理解你的问题是正确的,你想做一些叫做模式匹配的事情。
那里有很多算法。第一个起点是这里的这个页面
从算法来看,Turbo-Boyer-Moore 是表现最好的一种。
但是你也可以用数据结构来处理这个问题,比如后缀树: 参见这篇关于后缀树的文章(或简称为 Trie)
这是 Boyer-Moore 算法Codeproject 关于 Boyer-Moore 的文章的实现