C#中的Skip()和Take()以及和SubString()的不同

Skip()和Take()方法都是IEnumerable<T> 接口的扩展方法,包括C#中的所有Collections类,如ArrayList,Queue,Stack等等,还有数组和字符串都可以调用这两个方法。

            int[] test = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
test.Skip(i)表示从下标i开始截取,返回类型为IEnumerable<T>,返回的集合中包括test[i]
            Console.WriteLine(string.Concat(test.Skip(0)));;//结果为{0,1,2,3,4,5,6,7,8,9,}
test.Take(i)表示到下标i结束截取,返回类型为IEnumerable<T>,返回的集合中不包括test[i]
            Console.WriteLine(string.Concat(test.Take(0)));//结果为空字符串
注意在Skip和Take连用时,后者的输入是前者的输出,而不是原输入
            Console.WriteLine(string.Concat(test.Skip(2).Take(4)));//注意!结果为{2,3,4,5} 
.Skip().Take()连用可以起到截取子集的效果,包括字符串。SubString()只能被string类型调用,有两个重载方法:

SubString(i)和Skip(i)相同

            Console.WriteLine(string.Concat(test).Substring(0));//结果为{0,1,2,3,4,5,6,7,8,9,}

当0<=i<=j<test.Length时,SubString(i,j)和test.Skip(i).Take(j)相同

            Console.WriteLine(string.Concat(test).Substring(2,4));//结果为{2,3,4,5}
//当i>j会报错
            Console.WriteLine(string.Concat(test).Substring(10,5));//报错:索引和长度必须引用该字符串内位置

Skip()Take()对越界参数的处理方式不同

虽然test.Length等于10,但是Skip(100)和Take(100)甚至负数操作都是合法的,不会报错

            Console.WriteLine(string.Concat(test.Skip(100)));//结果为空字符串
            Console.WriteLine(string.Concat(test.Take(100)));//结果为0123456789
            Console.WriteLine(string.Concat(test.Skip(-100)));结果为0123456789
            Console.WriteLine(string.Concat(test.Take(-100)));//结果为空字符串
但是SubString()对于越界操作会报错

            Console.WriteLine(string.Concat(test).Substring(-100));
            Console.WriteLine(string.Concat(test).Substring(100));
            Console.WriteLine(string.Concat(test).Substring(-100,-100));
            Console.WriteLine(string.Concat(test).Substring(-100,100));
            Console.WriteLine(string.Concat(test).Substring(1,-100));//全部都会报错
还应该注意的是,对于{12,14,17}这种集合,在没有使用string.Concat()之前Take()和Skip()会把它看做只有3个元素,在使用

string.Concat()之后,SubString()和Take()和Skip()都会把它看做有6个元素(字符)。



欢迎补充。



  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值