将 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
。
我怎样才能达到
的等价物// 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
。