我有一个这样的有序列表:
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,但大多数方法似乎并不关心基础列表的顺序。
有什么想法吗?
答案 0 :(得分: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();
答案 1 :(得分: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)
总是将它分成两个不相交的序列,覆盖整个序列。 SkipWhile
和TakeWhile
也是如此。