一、前言
擅长数据分析的语言,他们的数组或者列表有一个切片的功能,用着十分好用
大概的服用方式如下:
//假代码
var ary = [0,1,2,3,4,5]
ary[0,1] //[1,2]
ary[3,end] //[3,4,5]
本文知识点:
【1】Linq 之 Skip() Take()
【2】扩展方法
二、C#中要实现的目标
假定你有一个array,你可以直接调用Slice(startIdx,endIdx)进行切片
请问这个Slice要
如何实现?
三、Linq中Skip和Take的用法
myList.Skip(idx) //下标为idx之前的所有item都会被忽略,然后取剩余的item元素
例如:myList.Skip(2) //取myList中下标从2到结束的所有item
myList.Take(count) //在myList中取count个元素,从start位置开始取
myList.Skip(0).Take(3) //取3个item,从index为0的位置开始取
四、Slice(startIndex,endIndex)的实现
startIdx:开始的下标
endIdx :结束的下标
myList.Skip(startIdx).Take(endIdx - startIdx + 1) //在myList中切片,取从startIdx取到endIdx
五、如何实现【myList.Slice(,)】–扩展方法
/// <summary>
/// 扩展方法:对一个list进行切片,指定【开始下标】和【结束下标】,然后返回这些系列组成的列表
/// </summary>
/// <typeparam name="T">list中item的类型</typeparam>
/// <param name="myList">要切片的列表</param>
/// <param name="startIdx">起始的下标</param>
/// <param name="endIdx">结束的下标</param>
/// <returns>返回符合条件的item组成的列表</returns>
public static List<T> Slice<T>(this List<T> myList, int startIdx, int endIdx)
{
return myList.Skip(startIdx).Take(endIdx - startIdx + 1).ToList();
}
六、测试
int[] aryInt = new int[5] { 0, 1, 2, 3, 4 };
Debug.Log("==========Slice(1, 2)==========");
aryInt.ToList().Slice(1, 2).ForEach(x=> Debug.Log(x));
Debug.Log("==========Slice(0, 4)==========");
aryInt.ToList().Slice(0, 4).ForEach(x => Debug.Log(x));
Debug.Log("==========Slice(-5, 5)==========");
aryInt.ToList().Slice(-1, 5).ForEach(x => Debug.Log(x));
测试结果