c#中的list集合操作方法getRange(index,count)
- 有两个参数,一个是下标,第二表示取得元素的个数.
public List<T> GetRange(int index, int count)
{
if (index < 0)
ThrowHelper.ThrowIndexArgumentOutOfRange_NeedNonNegNumException();
if (count < 0)
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.count, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum);
if (this._size - index < count)
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_InvalidOffLen);
List<T> objList = new List<T>(count);
Array.Copy((Array) this._items, index, (Array) objList._items, 0, count);
objList._size = count;
return objList;
}
上面的是getRange的原码.
其原理就是通过构造一个数组来实现取值,最后转为集合返回.
using System;
using System.Collections.Generic;
namespace helloword
{
class Program
{
static void Main(string[] args)
{
var list1 = new List<int>() { 1, 2, 3, 4, 5 };
var index = 2;
var count = 3;
var result = list1.GetRange(index, count);
foreach (var t in result)
{
Console.WriteLine(t);
}
}
}
}
结果是
3
4
5
现在我debug进去看一下执行的过程
image.png
我们传入的长度其实是5,但是这里是8,2^3.容量的算法感兴趣的可以再去看看.
public static void Copy(
Array sourceArray,
int sourceIndex,
Array destinationArray,
int destinationIndex,
int length)
{
Array.Copy(sourceArray, sourceIndex, destinationArray, destinationIndex, length, false);
}
这里是取值算法.看源码后会发现挺简单的.
接下来说一下java怎么去实现这个功能.
看懂原理后其实就很简单了.从index开妈向取count个元素.我们也不用中间数组来操作.直接拿一个新集合来接收就可以了.
具体实现如下:
package cn.cmeizu.helloword.test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @author 陈英俊
* @date 2020/6/10 13:57
*/
public class LinkedListDemo {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
int index = 2;
int count = 3;
for (int i = 0; i < count; i++) {
System.out.println(list.get(index + i));
}
}
}
结果:
3
4
5
网友评论