将前10个列表项移动到另一个项目列表中

3

我有一个 List<Item> OldItems = new List<Item>,我想将 OldItems 的前10个项目移动到 NewItems 中,而 NewItemsList<Item> NewItems= new List<Item>

是否有类似的方法?

NewItems.AddRange(OldItems.<First10Items>);
OldItems.Delete(<First10Items>);
5个回答

12

试一试:

NewItems.AddRange(OldItems.Take(10));
OldItems = OldItems.Skip(10).ToList();

替代:

NewItems.AddRange(OldItems.Take(10));
OldItems.RemoveRange(0,10);

从你的列表中获取前x个元素,请点击此处查看Take方法。 从你的列表中跳过前x个元素,请点击此处查看Skip方法。如果你使用列表,则RemoveRange是另一种选择,请参考该链接。 正如Matthew所说,第二个选项不会创建新的列表,并在原地进行删除,因此更可取。


1
那个无法编译。OldItems是一个列表,所以你不能将Skip()的结果赋值给它。 - Matthew Watson
糟糕,正在修复。我还没有查看定义。谢谢。 - Kamil Budziewski
你还需要一个 OldItems.RemoveRange(0, 10) - dabide
@dabide 为什么?“OldItems”被覆盖。不需要删除范围。 - Kamil Budziewski
2
我认为这里的问题可能是您没有从OldItems中删除任何项 - 相反,您创建了一个新列表,并将OldItems分配给新列表中已删除的项。我认为OP可能希望进行原地删除(尽管他没有明确要求)。但是,如果其他任何东西也通过不同的引用引用到OldItems,则仍将看到旧的未修改的列表。 - Matthew Watson
1
@MatthewWatson 很好的观点,谢谢。我用 RemoveRange 写了第二个代码片段,这将解决这个问题。 - Kamil Budziewski

3

您可以这样做:

var NewItems = OldItems.GetRange(0, 10);
OldItems.RemoveRange(0, 10);

(这不使用Linq)


我不想显得无礼,但是有linq标签,所以最好使用linq回答 :) - Kamil Budziewski
4
@wudzik 不过,你认为那将是一个XY问题吗? - Matthew Watson
你说得对,但今天是星期一,对吧? :) 感谢提供参考。 - Kamil Budziewski

2

试试这个

List<Item> oldItems = new List<Item>();
List<Item> newItems = new List<Item>();
newItems.AddRange(oldItems.Take(10));//add first 10 items to new list
oldItems.RemoveRange(0, 10);//remove first 10 items from old list

1
您可以使用


GetRange(int index, int count); RemoveRange(int index, int count);

实现这个。

-2
List<string> checkForNull = new List<string>();
        List<string> newList = new List<string>();
        for (int i = 0; i < 10; i++)
        {
            checkForNull.Add(Convert.ToString(i));
        }
        for (int i = 10; i < 20; i++)
        {
            newList.Add(Convert.ToString(i));
        }
        checkForNull.AddRange(newList.Take(5));
        newList.RemoveRange(0, 5);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接