列表包含列表检查

eug*_*neK 4 .net c# linq

我有一个IEnumerable<Object> a按时间顺序排列的6件物品.我想IEnumerable<Object> b按时间顺序测试是否包含3个项目的列表.

IEnumerable<Object> a 项目值:a,b,c,d,f,g

IEnumerable<Object> b 项目值:b,d,f

是否可以使用LINQ完成?

Raw*_*ing 8

您可以使用以下内容:

bool AContainsEverythingInBInTheSameOrder =
    a.Intersect(b).SequenceEquals(b);
Run Code Online (Sandbox Code Playgroud)

a.Intersect(b)返回的一切,是在既ab,在它出现在相同的顺序a.


Dan*_*rth 7

罗林和蒂姆的单线方法非常好,但它有一个小问题:b迭代两次.
如果这对您来说是个问题,您可以使用基于迭代器的方法.这可以创建为扩展方法:

public static bool IsContainedWithinInOrder<T>(this IEnumerable<T> values,
                                               IEnumerable<T> reference)
{
    using(var iterator = reference.GetEnumerator())
    {
        foreach(var item in values)
        {
            do
            {
                if(!iterator.MoveNext())
                    return false;
            } while(!Equals(iterator.Current, item));
        }

        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

这将只迭代两个序列一次,总体上更轻量级.你会这样称呼它:

b.IsContainedWithinInOrder(a);
Run Code Online (Sandbox Code Playgroud)

请原谅方法的名称......


Tim*_*ter 6

我假设您有两个列表,并且您想要检查第二个列表项是否与第一个列表中的相同项目具有相同的顺序.

也许:

var allSameOrder = list1.Intersect(list2).SequenceEqual(list2);
Run Code Online (Sandbox Code Playgroud)

演示

  • 很棒的答案和演示 (2认同)