4

我有一个IEnumerable<Object> a按时间顺序排列的 6 个项目。我想测试是否IEnumerable<Object> b按时间顺序列出了 3 个项目。

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

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

可以用 LINQ 完成吗?

4

3 回答 3

8

您可以使用以下内容:

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

a.Intersect(b)返回 和 中的所有内容,a按照它出现在 中的相同顺序b返回。a

于 2012-12-10T13:30:25.947 回答
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);

请原谅方法的名称...

于 2012-12-10T13:27:25.800 回答
6

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

也许:

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

演示

于 2012-12-10T13:31:46.497 回答