Check if one list contains all items from another list in order

后端 未结 4 1190
眼角桃花
眼角桃花 2020-12-16 06:51

How can I determine if List A contains all of the elements from List B in the same order?

List A can have additional elements that List B does not have, but must co

4条回答
  •  没有蜡笔的小新
    2020-12-16 07:30

    Here's a quick way:

    var equal = listA.Count - listB.Count < 0 
        ? false 
        : Enumerable.Range(0, listA.Count - listB.Count).Any(i => 
          listA.Skip(i).Take(listB.Count).SequenceEqual(listB));
    

    However, I'd prefer to use an extension method like this:

    public static bool ContainsSequence(this IEnumerable outer, 
                                           IEnumerable inner)
    {
        var innerCount = inner.Count();
        for(int i = 0; i < outer.Count() - innerCount; i++)
        {
            if(outer.Skip(i).Take(innerCount).SequenceEqual(inner))
                return true;
        }
    
        return false;
     }
    

    which you can call like:

    var equals = listA.ContainsSequence(listB);
    

    And here's a more efficient version of the same extension method specific to List:

    public static bool ContainsSequence(this List outer, List inner)
    {
        var innerCount = inner.Count;
    
        for (int i = 0; i < outer.Count - innerCount; i++)
        {
            bool isMatch = true;
            for (int x = 0; x < innerCount; x++)
            {
                if (!outer[i + x].Equals(inner[x]))
                {
                    isMatch = false;
                    break;
                }
            }
    
            if (isMatch) return true;
        }
    
        return false;
    }
    

提交回复
热议问题