列表包含列表检查

时间:2012-12-10 13:23:20

标签: c# .net 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完成?

3 个答案:

答案 0 :(得分:8)

您可以使用以下内容:

bool AContainsEverythingInBInTheSameOrder =
    a.Intersect(b).SequenceEquals(b);

a.Intersect(b)按照a 中显示的顺序返回ba中的所有内容。

答案 1 :(得分:7)

Rawling和Tim的单线方法非常好,但它有一点点问题: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;
    }
}

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

b.IsContainedWithinInOrder(a);

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

答案 2 :(得分:6)

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

也许:

var allSameOrder = list1.Intersect(list2).SequenceEqual(list2);

Demo