c# -在数组中搜索序列

本文关键字:搜索 数组 | 更新日期: 2023-09-27 18:16:23

我有一些用1和0填充的数组。是否有简单的方法来找到,例如,10个字段相邻的值为1?

类似于:if (array[i…]我+10]= 1)->做一些事情?

我知道我可以用for来做,但我有一个巨大的多重数组,这将非常有用。

c# -在数组中搜索序列

使用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算法的代码项目文章