列表中包含的列表检查

问题描述:

我有一个IEnumerable<Object> a 6个项目按时间顺序在它。 我想测试是否列表IEnumerable<Object> b与3项按时间顺序。列表中包含的列表检查

IEnumerable<Object> a项目值:A,B,C,d,F,G

IEnumerable<Object> b项目值:B,d,F

是否有可能与LINQ做什么?

+2

所以你要检查一切'B'也是'了',或者你_know_,他们将和只想检查他们是在正确的顺序? – Rawling

+0

你的意思是按字母排序而不是按时间顺序排列? –

+0

@Rawling,是我想检查列表a是否包含列表b中的所有项目,顺序相同 – eugeneK

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

那个downvote疯狂得很快。 = D –

+0

Daniel可能在*上遇到了敌人......我现在就试试这个解决方案。 – eugeneK

+0

除了缺少'using'之外,我更喜欢这个,因为它不依赖于与'相交'相反的指定行为,并且它不会打扰它存储的任何东西需要记忆。 (和双迭代的东西 - 我错过了。) – Rawling

您可以使用以下方法:

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

a.Intersect(b)回报一切,是在这两个ab,其出现在a中。

+0

如果列表包含重复值列表1,2,3,1,2列表b 1,2,1 – eugeneK

+0

@eugeneK Yup,那么您就在那里。(没有意识到你的问题可能有重复。) – Rawling

+0

@eugeneK:你必须承认你从未提到过这个要求。 –

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

也许:

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

Demo

+2

伟大的答案和演示 –

+0

不会工作,如果列表包含重复值列表1,2,3,1,2列表b 1,2,1 – eugeneK