2012-03-23 11 views
2

私はこのような順序付きリストを持っている:2つに分割してリストを並べ替えるすっきりした方法はありますか?

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

私は2つのサブリストの順序を保持しつつ、半分にリストをカットし、半分の順序を逆にしたいです。私が考えることができる唯一の方法は、次のようなものです:

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)は、それを常に配列全体をカバーする2つのディスジョイント配列に分割する。 SkipWhileTakeWhileについても同様です。

関連する問題