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

时间:2016-10-26 08:44:44

标签: c# arrays

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

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();

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

5 个答案:

答案 0 :(得分:2)

    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长度等于lesserArray长度的多个子序列,并将其与lesserArray匹配。

答案 1 :(得分:0)

更通用,不使用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<T>(this T[] data, int index, int length)
        {
            T[] result = new T[length];
            Array.Copy(data, index, result, 0, length);
            return result;
        }

答案 2 :(得分:0)

这应该做你的工作

int[] grtarr = { 8, 3, 4, 5, 9, 12, 6 };
int[] lsarr = { 3, 4, 5 };

List<int> lstGrtArr = grtarr.ToList();
List<int> 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
}

答案 3 :(得分:0)

    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;
    }

答案 4 :(得分:-1)

使用这段代码:

public bool ArraysEqual<T>(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<T> comparer = EqualityComparer<T>.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);