将 List<T> 缩减为它自己的子列表

Reduce a List<T> to a sublist of itself

我怎样才能达到

的等价物
// myList is a List<T>

myList = myList.GetRange(offset, number);

作为就地声明? (即不在此过程中创建新列表)

without creating a new list

如何枚举 LINQ Skip/Take 的结果:

myList.Skip(offset).Take(number);

如果您希望对列表进行永久更改:

myList.RemoveRange(offset+number, myList.Count - (offset+number));
myList.RemoveRange(0, offset);

您可能会发现创建新列表比从现有列表中删除要快;如果您出于性能原因这样做,请务必赛马

由于 List 处理其内部数组的方式,不太可能。 另一个“问题”是新列表会有添加、删除等。这些会如何影响原始列表?

取决于这个新“切片”的使用方式...也许 IReadOnlyList 门面是合适的? 注入列表、偏移量、数字。使用 args 实现方法以偏移到内部列表索引器中...(保护范围大于 List.Count 等) 您需要实现一个具有相同偏移量的枚举器,但是使用 yield

这很容易

或者... CollectionsMarshal.AsSpan(myList).Slice(offset, number); 将为您提供内部数组的跨度。这有一个枚举器、索引器、计数。

仍然需要注意offset+range不要大于Capacity。如果列表的容量更改为与跨度相交,它将变得“棘手”。由于 List 将创建一个新数组,但您的跨度仍将超过旧数组。

另一种“小心翼翼”的情况:)

就地更新列表的更简单方法:

myList.RemoveRange(0, offset); // Remove items at the beginning
myList.RemoveRange(count, myList.Count - count); // Remove items at the end

这有 O(n) 复杂性,其中 n = myList.Count - count