检查数组是否包含与其他数组完全相同的序列

我有一个问题,我需要检查一些数组是否是更大数组的一部分,这将是相当容易的但我需要检查更大的数组是否包含完全相同的序列。 例如

int[] greaterArray = {8, 3, 4, 5, 9, 12, 6 ... n - elements} int[] lesserArray = {3, 4, 5} 

现在我需要知道较小的数组是否是这个数组的一部分,但具有相同的序列,所以它在更大的数组中包含3,4,5彼此相邻。

我试过了:

 var exists = greaterArray.Intersect(lesserArray).Any(); 

但是如果较小数组的任何元素存在于更大的数组中,而不是精确的序列,它会返回给我信息。 有任何想法吗?

  int[] greaterArray = {8, 3, 4, 5, 9, 12, 6}; int[] lesserArray = { 3, 4, 5 }; bool sequenceFound = false; for (int i = 0; i <= greaterArray.Length - lesserArray.Length; i++) { if (greaterArray.Skip(i).Take(lesserArray.Length).SequenceEqual(lesserArray)) { sequenceFound = true; break; } } if (sequenceFound) { //sequence found } else { //sequence not found } 

使用上面的代码。 它需要来自greaterArray的多个子序列, greaterArray长度等于lesserArray的长度,并将其与lesserArray匹配。

更通用,不使用LINQ:

 int[] greaterArray = {8, 2, 4, 5, 9, 12, 3, 4, 5}; int[] lesserArray = {3, 4, 5}; for (int i = 0; i <= greaterArray.Length - lesserArray.Length; i++) { var sub = greaterArray.SubArray(i, lesserArray.Length); if (Enumerable.SequenceEqual(sub, lesserArray)) { Console.WriteLine("Equals!"); } } 

这个工具来获取SubArray:

 public static T[] SubArray(this T[] data, int index, int length) { T[] result = new T[length]; Array.Copy(data, index, result, 0, length); return result; } 

这应该做你的工作

 int[] grtarr = { 8, 3, 4, 5, 9, 12, 6 }; int[] lsarr = { 3, 4, 5 }; List lstGrtArr = grtarr.ToList(); List lstLsrArr = lsarr.ToList(); bool sequenceMatch = false; for (int i = 0; i < grtarr.Count(); i++) { if (lstGrtArr.Where(x => lstGrtArr.IndexOf(x) >= i).Take(lstLsrArr.Count()).SequenceEqual(lstLsrArr)) { sequenceMatch = true; break; } } if(sequenceMatch) { //Do Something } 
  static bool isPrefix(int[] source, int start_pos, int[] prefix) { bool result = start_pos + prefix.Length <= source.Length; for (int i = 0; result && i < prefix.Length; ++i, ++start_pos) result = source[start_pos] == prefix[i]; return result; } static bool Contains(int[] source, int[] prefix) { bool result = false; for (int i = 0; !result && i < source.Length; ++i) result = source[i] == prefix[0] ? isPrefix(source, i, prefix) : false; return result; } 

使用这段代码:

 public bool ArraysEqual(T[] a1, T[] a2) { if (ReferenceEquals(a1,a2)) return true; if (a1 == null || a2 == null) return false; if (a1.Length != a2.Length) return false; EqualityComparer comparer = EqualityComparer.Default; for (int i = 0; i < a1.Length; i++) { if (!comparer.Equals(a1[i], a2[i])) return false; } return true; } 

或者如果你想使用Linq并且不太关心性能,最简单的事情是:

 var arrays_are_the_same = Enumerable.SequenceEqual(a1, a2);