
LINQ之Skip,SkipWhile
发布日期:2021-05-07 00:14:35
浏览次数:21
分类:技术文章
本文共 7201 字,大约阅读时间需要 24 分钟。
目录
Skip()
如果我不需要此数组的第一个元素,那么有没有办法只删除第一个元素并得到其余的元素?
Skip()
就是为了解决这种情况而存在的。 如果您从头开始指定不需要的元素数目,则将返回该数目之后的元素序列。 public static IEnumerable<TSource> Skip<TSource>( this IEnumerable<TSource> source, int count );
代码示例:
public static class Program{ static void Main( string[] args ) { int[] numbers = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; string[] texts = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; // 跳过开始的3个 IEnumerable skippedNumbers = numbers.Skip( 3 ); // 跳过开始的4个 IEnumerableskippedTexts = texts.Skip( 4 ); System.Console.WriteLine( "skippedNumbers:{0}", skippedNumbers.Text() ); System.Console.WriteLine( "skippedTexts:{0}", skippedTexts.Text() ); System.Console.ReadKey(); } public static string Text ( this IEnumerable i_source ) { string text = string.Empty; foreach( var value in i_source ) { text += string.Format( "[{0}], ", value ); } return text; }} skippedNumbers:[3], [4], [5], [6], [7], [8], [9],skippedTexts:[Thu], [Fri], [Sat],
如果将大于总数的数字或负数传递给此参数,它也会正常工作。
具体效果看下面案例。示例代码:
public static class Program{ static void Main( string[] args ) { int[] numbers = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; string[] texts = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; // 超过总数 IEnumerable skippedNumbers = numbers.Skip( 100 ); // 跳过负数 IEnumerableskippedTexts = texts.Skip( -5 ); System.Console.WriteLine( "skippedNumbers:{0}", skippedNumbers.Text() ); System.Console.WriteLine( "skippedTexts:{0}", skippedTexts.Text() ); System.Console.ReadKey(); } public static string Text ( this IEnumerable i_source ) { string text = string.Empty; foreach( var value in i_source ) { text += string.Format( "[{0}], ", value ); } return text; }} skippedNumbers:skippedTexts:[Sun], [Mon], [Tue], [Wed], [Thu], [Fri], [Sat],
由此我们可以发现,参数为负数时会获取所有元素,参数大于元素总数时获取不到元素。
SkipWhile()
Skip()可以指定跳过的数目。
但是您可能需要指定特定的跳过条件,而不是元素数。在这种情况下就可以使用SkipWhile()
。 您可以在参数中设置跳过的条件。 public static IEnumerable<TSource> SkipWhile<TSource>( this IEnumerable<TSource> source, Func<TSource, bool> predicate );
它将跳过满足条件的元素。 在下面的示例中,使用lambda表达式描述了条件语句。 代码示例:
public static class Program{ static void Main( string[] args ) { int[] numbers = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; string[] texts = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; // 小与7的 IEnumerable skippedNumbers = numbers.SkipWhile( value => value < 7 ); // 删除尾字母为n的 IEnumerableskippedTexts = texts.SkipWhile( value => value.EndsWith( "n" ) ); System.Console.WriteLine( "skippedNumbers:{0}", skippedNumbers.Text() ); System.Console.WriteLine( "skippedTexts:{0}", skippedTexts.Text() ); System.Console.ReadKey(); } public static string Text ( this IEnumerable i_source ) { string text = string.Empty; foreach( var value in i_source ) { text += string.Format( "[{0}], ", value ); } return text; }} skippedNumbers:[7], [8], [9],skippedTexts:[Tue], [Wed], [Thu], [Fri], [Sat],
当您使用SkipWhile()指定要跳过的条件时,不仅可以获取每个元素的信息,还可以获取每个元素的索引值。
public static IEnumerable<TSource> SkipWhile<TSource>( this IEnumerable<TSource> source, Func<TSource, int, bool> predicate );
在以下示例中,index索引号作为参数在lambda表达式条件语句中传递。
代码示例:
public static class Program{ static void Main( string[] args ) { int[] numbers = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; string[] texts = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; // value值 * 索引值小于20 IEnumerable skippedNumbers = numbers.SkipWhile( ( value, index ) => value * index < 20 ); // value的长度大于索引值 IEnumerableskippedTexts = texts.SkipWhile( ( value, index ) => value.Length > index ); System.Console.WriteLine( "skippedNumbers:{0}", skippedNumbers.Text() ); System.Console.WriteLine( "skippedTexts:{0}", skippedTexts.Text() ); System.Console.ReadKey(); } public static string Text ( this IEnumerable i_source ) { string text = string.Empty; foreach( var value in i_source ) { text += string.Format( "[{0}], ", value ); } return text; }} skippedNumbers:[5], [4], [3], [2], [1], [0],skippedTexts:[Wed], [Thu], [Fri], [Sat],
SkipWhile()和Where()的区别
SkipWhile()和LINQ函数中的Where()类似。
public static IEnumerable<TSource> Where<TSource>( this IEnumerable<TSource> source, Func<TSource, bool> predicate );
Where()是与条件具有相同元素的函数。
让我们将此Where()与SkipWhile()进行比较。在下面的示例中,描述了省略低于指定数值的元素的条件。
代码示例:
public static class Program{ static void Main( string[] args ) { int[] numbers = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // 值小于5 IEnumerable skippedNumbers = numbers.SkipWhile( value => value < 5 ); // 值大于等于5 IEnumerable whereNumbers = numbers.Where( value => value >= 5 ); System.Console.WriteLine( "skippedNumbers:{0}", skippedNumbers.Text() ); System.Console.WriteLine( "whereNumbers :{0}", whereNumbers.Text() ); System.Console.ReadKey(); } public static string Text( this IEnumerable i_source ) { string text = string.Empty; foreach( var value in i_source ) { text += string.Format( "[{0}], ", value ); } return text; }} skippedNumbers:[5], [6], [7], [8], [9],whereNumbers :[5], [6], [7], [8], [9],
得到了相同的结果。
前面我们使用的是有组织的数据,其中作为数据的值按升序排列。 现在,让我们打乱此数据序列,然后再次进行验证。代码示例:
public static class Program{ static void Main( string[] args ) { int[] numbers = new int[] { 0, 3, 6, 1, 4, 5, 8, 7, 2, 9 }; // 值小于5 IEnumerable skippedNumbers = numbers.SkipWhile( value => value < 5 ); // 值大于等于5 IEnumerable whereNumbers = numbers.Where( value => value >= 5 ); System.Console.WriteLine( "skippedNumbers:{0}", skippedNumbers.Text() ); System.Console.WriteLine( "whereNumbers :{0}", whereNumbers.Text() ); System.Console.ReadKey(); } public static string Text( this IEnumerable i_source ) { string text = string.Empty; foreach( var value in i_source ) { text += string.Format( "[{0}], ", value ); } return text; }} skippedNumbers:[6], [1], [4], [5], [8], [7], [2], [9],whereNumbers :[6], [5], [8], [7], [9],
结果变更。
Where()
,移除所有符合条件的元素,并返回其他元素。 SkipWhile()
,从头开始算,遇到符合条件的的元素就移除,遇到不符合条件的直接结束,无论后续有没有符合条件的元素。 因此,Where()
的结果是返回所有不小于5的所有元素。
SkipWhile()
的结果是移除从头开始小于5的元素。如遇到不满足条件的则直接停止。 发表评论
最新留言
不错!
[***.144.177.141]2025年03月20日 07时34分17秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
使用开源可视化工具来理解你的 Python 代码 | Linux 中国
2019-03-03
硬核观察 | 有人在比特币骗局中损失了 10 个比特币
2019-03-03
使用 top 命令了解 Fedora 的内存使用情况 | Linux 中国
2019-03-03
8皇后问题 递归 函数调用是重点
2019-03-03
1541 +1 *2 ²
2019-03-03
面试别慌!阿里专家带你从【入门+基础+进阶+项目】攻破SpringBoot
2019-03-03
【Java面试】30个 Java 集合面试必备的问题和答案
2019-03-03
华为鸿蒙到底是不是安卓系统套了个壳?
2019-03-03
fragment中recyclerview的重新加载问题
2019-03-03
window程序设计(1):第一个windows程序
2019-03-03
windows程序设计(4):文本输出
2019-03-03
21.2.3总结
2019-03-03
线性代数和数学期望杂题
2019-03-03
【SSL_P2876】2017年东莞市信息学特长生测试题 工程
2019-03-03
【洛谷_P1433】吃奶酪
2019-03-03
volatile关键字和AtomicInteger
2019-03-03
redisTemplate.opsForHash()
2019-03-03
maven生命周期
2019-03-03
方法的绑定机制-静态绑定和动态绑定
2019-03-03