我有以下列表:
List<string> l=new List<string()>{"a","b","c","d","1","2","3","4","a1","b2","c3","d4"};
我有oldIndex
,size
和newIndex
。
让我们说上面的列表oldIndex = 4
,size = 4
,newIndex = 0
。
我想要的输出列表是:
{"1","2","3","4","a","b","c","d","a1","b2","c3","d4"};
我发现的解决方案是(对所有情况都不起作用):
for(int i=0;i<size;i++)
{
if(oldIndex<newIndex)
{
var x=l[oldIndex];
l.RemoveAt(oldIndex);
l.Insert(newIndex+size-1,x);
}
else
{
var x=l[oldIndex+i];
l.RemoveAt(oldIndex+i);
l.Insert(newIndex+i,x);
}
}
有没有更好的方法,可能使用LINQ或更好的东西,或者上面是唯一的方法吗?
我从this链接找到了上面的答案。这个问题的不同之处在于我想移动一个块,而不仅仅是单个元素。
您可以使用以下内容:
List<string> removedRange = l.GetRange(oldIndex, size);
l.RemoveRange(oldIndex, size);
l.InsertRange(newIndex, removedRange);
有很多不同的方法可以做到这一点。
Raviraj Palvankar's answer可能是最简单的,但为了补充它(并且因为你特别提到了linq),这里有几个(公认有些过度设计)替代方案。
List<string> l = new List<string>{"a","b","c","d","1","2","3","4","a1","b2","c3","d4"};
var oldIndex = 4;
var size= 4;
var newIndex = 0;
移动:
var toMove = l.Skip(oldIndex).Take(size).ToList();
var newList = l.Take(oldIndex).ToList().Concat(l.Skip(oldIndex + size)).ToList();
newList.InsertRange(newIndex, toMove);
如果你能够移动部分{"a","b","c","d"}
(需要知道一个不同的新索引,并且不需要oldIndex
,因为它将为0),那么移动操作本身变得更容易:
var newIndex = 4; // Replace previous value which was 0
var size= 4; // Elements a - d
var newList = l.Skip(size).ToList();
newList.InsertRange(newIndex, l.Take(size));
......还有另一种方式(实际上可能是最简单的阅读方式):
var oldIndex = 4;
var size= 4;
var toMove = l.Skip(oldIndex).Take(size).ToList();
var firstPart = l.Take(oldIndex);
var lastPart = l.Skip(oldIndex + size);
var combined = toMove.Concat(firstPart).Concat(lastPart);