如何在c#中移动列表中的项目子集?

问题描述 投票:-2回答:2

我有以下列表:

List<string> l=new List<string()>{"a","b","c","d","1","2","3","4","a1","b2","c3","d4"};

我有oldIndexsizenewIndex

让我们说上面的列表oldIndex = 4size = 4newIndex = 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链接找到了上面的答案。这个问题的不同之处在于我想移动一个块,而不仅仅是单个元素。

c# list
2个回答
5
投票

您可以使用以下内容:

List<string> removedRange = l.GetRange(oldIndex, size);
l.RemoveRange(oldIndex, size);
l.InsertRange(newIndex, removedRange);

1
投票

有很多不同的方法可以做到这一点。

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);
© www.soinside.com 2019 - 2024. All rights reserved.