首页 文章

如何检查列表是否包含相同顺序的另一个列表

提问于
浏览
5

在c#中是否有任何简单的方法来检查列表是否包含另一个列表?这是一个例子,我有:

var list1 = new List<int>() {1, 2, 3, 4, 5, 6,}; 和第二个 var list2 = new List<int>() {5, 6};

此列表是第一个列表的一部分,因此它应返回true .

var list1 = new List<int>() {1, 2, 3, 4, 5, 6,};var list3 = new List<int>() {1, 3}; 应该返回false .

它不是要检查第一个列表中的所有元素是否都存在于第二个列表中,而是关于顺序 . 它必须具有相同的顺序 .

2 回答

  • 2

    这对我有用:

    public bool ContainsSubsequence<T>(List<T> sequence, List<T> subsequence)
    {
        return
            Enumerable
                .Range(0, sequence.Count - subsequence.Count + 1)
                .Any(n => sequence.Skip(n).Take(subsequence.Count).SequenceEqual(subsequence));
    }
    

    此代码使用 Enumerable.Range 遍历 sequence 中可能与 subsequence 相同的每个可能起点,并检查 sequence 与此位置 subsequence 相同大小的段是否实际上等于 subsequence .

    所以对于这段代码:

    var list1 = new List<int>() { 1, 2, 3, 4, 5, 6, };
    var list2 = new List<int>() { 5, 6, };
    var list3 = new List<int>() { 1, 3, };
    
    Console.WriteLine(ContainsSubsequence(list1, list2));
    Console.WriteLine(ContainsSubsequence(list1, list3));
    

    我明白了:

    True
    False
    
  • 11

    感谢@GeorgeVovos和@Enigmativity指出第一个解决方案中的问题 .

    public static bool HasSubSequence(List<int> main, List<int> query)
    {
        var startIndex = main.IndexOf(query.First());
        if (main == null || query == null || startIndex < 0)
            return false;
    
        while (startIndex >= 0)
        {        
            if (main.Count - startIndex < query.Count)
                return false;
            var nonMatch = false;
            for (int i = 0; i < query.Count; i++)
            {
                if (main[i + startIndex] != query[i])
                {
                    main = main.Skip(startIndex + 1).ToList();
                    startIndex = main.IndexOf(query.First());
                    nonMatch = true;
                    break;
                }
            }
            if (!nonMatch)
                return true;
        }
        return false;
    }
    

    var l1 = new List<int> { 1, 2, 3, 4, 5 };
    var l2 = new List<int> { 4, 5 };
    var l3 = new List<int> { 1, 3 };
    var l4 = new List<int> { 5, 6 };
    
    var l5 = new List<int> { 1, 2, 3, 2, 5, 6, 2, 4, 8 };
    var l6 = new List<int> { 2, 4 };
    
    var test1 = HasSubSequence(l1, l2); //true
    var test2 = HasSubSequence(l1, l3); //false
    var test3 = HasSubSequence(l1, l4); //false
    
    var test5 = HasSubSequence(l5, l6); //true
    

相关问题