2012-03-23 4 views
2

이 같은 정렬 된 목록이 있습니다2로 나누고 목록을 재정렬하는 깔끔한 방법은 무엇입니까?

var list = new List<String>(){"aaa","aab","aac","baa","bab","bac"}; 

나는 두 개의 하위 목록의 순서를 유지하면서, 절반의 목록을 잘라 반쪽의 순서를 반대로합니다. 내가 그 일을 생각할 수있는 유일한 방법은 다음과 같이이다 :

var list = new List<String>() { "aaa", "aab", "aac", "baa", "bab", "bac" }; 
int index = list.IndexOf("aac"); 
var tempList = new List<String>(list.GetRange(index, list.Count - index)); 
tempList.AddRange(list.GetRange(0, index)); 
list = tempList; 

이 5 개 라인과 임시 변수를 취하고, 아주 좋은 보이지 않는다.

더 좋은 방법이 있습니까? 나는 그것이 Linq과 함께 가능해야한다고 생각했지만, 그 방법의 대부분은 기본 목록의 순서에 관심을 보이지 않는 것 같습니다.

아이디어가 있으십니까?

+2

당신이'Take'와'Skip'를 시도? –

답변

8

이 아마 짧은,하지만 속도가 느려질 수 있습니다

var list = new List<String> { "aaa", "aab", "aac", "baa", "bab", "bac" }; 
var index = list.IndexOf("aac"); 
var r = list.Skip(index).Concat(list.Take(index)).ToList(); 
+0

정말 고마워요. 고마워요. – Oliver

5

다니엘은 LINQ 간단한 해결책을 끝 사용, 말하기를 :

int splitIndex = 5; // Or whatever 
var result = list.Skip(splitIndex) 
       .Concat(list.Take(splitIndex)).ToList(); 

있을만큼 효율적되지 않습니다하지만 깔끔한이다 : 그것은 가정 것을 기억 가치가

(예 : List<T>), sequence.Take(x)sequence.Skip(x)은 항상 전체 시퀀스를 커버하는 두 개의 분리 된 시퀀스로 나눕니다. SkipWhileTakeWhile에 대해서도 마찬가지입니다.

관련 문제