2012-12-10 2 views
4

나는에 6 개의 항목이 시간 순서대로 표시되어 있습니다. 목록이 IEnumerable<Object> b이고 3 항목이 시간 순서대로 있는지 테스트하고 싶습니다.리스트에 목록이 들어 있습니다.

IEnumerable<Object> a 항목 값 A, B, C, D, F, G

IEnumerable<Object> b 항목 값 : B, D,

F는 LINQ으로 행해질 것이 가능?

+2

그래서 당신은 단지 b'가 A''에 또한'에 그 모든 것을 확인하려면, 또는 당신은 그들이 될 것이라고 _know_ 할 것을 확인 하시겠습니까 그들은 올바른 순서로 존재합니까? – Rawling

+0

연대순 대신 알파벳순을 의미합니까? –

+0

@Rawling, 예 목록 a에 목록 b의 모든 항목이 같은 순서로 포함되어 있는지 확인하고 싶습니다. – eugeneK

답변

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

그 downvote는 광막하게 빨랐다. = D –

+0

아마 Daniel이 StackOverflow에 적을 가졌습니다 ... 지금 해결책을 시도 할 것입니다. – eugeneK

+0

'using '이 부족한 것 외에'Intersect'의 반대 동작 방식에 의존하지 않기 때문에 이것을 선호합니다. 그리고 그것을 저장하지 않아도됩니다. 기억이 필요하다. (그리고 두 번 반복되는 것 - 나는 그것을 놓쳤다.) – Rawling

8

다음 사용할 수 있습니다 모두 a과에

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

a.Intersect(b) 반환 모든 b, 과 같은 순서로 표시됩니다. a.

+0

은 목록에 중복 값이있는 경우 작동하지 않습니다. 1,2,3,1,2 목록을 나열하십시오. 1,2,1 – eugeneK

+0

@eugeneK 네, 바로 거기에 있습니다.(당신의 질문에 당신이 중복을 가질 수 있다는 것을 깨닫지 못했습니다.) – Rawling

+0

@eugeneK : 당신은 당신이이 요구 사항을 언급 한 적이 없다는 것을 인정해야합니다. –

6

두 개의 목록이 있고 두 번째 목록 항목이 첫 번째 목록의 동일한 항목과 동일한 순서로되어 있는지 확인하려고한다고 가정합니다. 아마도

:

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

Demo

+2

위대한 답변과 데모 –

+0

목록에 중복 값이 ​​포함되어 있으면 작동하지 않습니다. 1,2,3,1,2 목록을 나열합니다. 1,2,1 – eugeneK

관련 문제