这是一个简单(但相当有效)的实现,它可以找到数组的所有出现,而不仅仅是第一个:
static class ArrayExtensions {
public static IEnumerable<int> StartingIndex(this int[] x, int[] y) {
IEnumerable<int> index = Enumerable.Range(0, x.Length - y.Length + 1);
for (int i = 0; i < y.Length; i++) {
index = index.Where(n => x[n + i] == y[i]).ToArray();
}
return index;
}
}
例子:
int[] x = { 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4 };
int[] y = { 2, 3 };
foreach (int i in x.StartingIndex(y)) {
Console.WriteLine(i);
}
输出:
1
5
9
该方法首先循环遍历x数组以查找y数组中第一项的所有出现,并将它们的索引放置在index数组中。然后它继续通过检查其中哪些也匹配y 数组中的第二项来减少匹配。当检查y 数组中的所有项目时,index 数组只包含完整匹配项。
编辑:
另一种实现是从循环中的语句中删除 ToArray 调用,使其成为:
index = index.Where(n => x[n + i] == y[i]);
这将完全改变该方法的工作方式。它不是逐级循环遍历项目,而是返回一个带有嵌套表达式的枚举器,将搜索推迟到迭代枚举器的时间。这意味着如果您愿意,您只能获得第一场比赛:
int index = x.StartingIndex(y).First();
这不会找到所有匹配项然后返回第一个,它只会搜索直到找到第一个然后返回它。