C# – TakeWhile和SkipWhile没有回来?
发布时间:2020-12-15 23:47:43 所属栏目:百科 来源:网络整理
导读:我有一个RekenReeks类,它返回从2开始的数字,乘以2.所以{2,4,8,16,32,64} 现在我了解了TakeWhile和SkipWhile方法以及LINQ. 所以我创建了3个变量应该存储完全相同,但我的Console.WriteLine只打印selection1而不是2和3. using System;using System.Collections.
我有一个RekenReeks类,它返回从2开始的数字,乘以2.所以{2,4,8,16,32,64}
现在我了解了TakeWhile和SkipWhile方法以及LINQ. 所以我创建了3个变量应该存储完全相同,但我的Console.WriteLine只打印selection1而不是2和3. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { RekenReeks reeks = new RekenReeks(2,n => n * 2); var selection = from i in reeks where i > 10 && i < 1000 select i; var selection2 = reeks.TakeWhile(n => n < 1000 && n > 10); var selection3 = reeks.SkipWhile(n => n > 1000 && n < 10); foreach (int i in selection) { Console.WriteLine("selection1 {0}",i); } foreach (int i in selection2) { Console.WriteLine("selection2 {0}",i); } foreach (int i in selection3) { Console.WriteLine("selection3 {0}",i); } Console.ReadLine(); } } public class RekenReeks : IEnumerable<int> { Func<int,int> getNew; int number; public RekenReeks(int starton,Func<int,int> getNewThing) { getNew = getNewThing; number = starton; } public IEnumerator<int> GetEnumerator() { yield return number; for (; ; ) { yield return getNew(number); number = getNew(number); } } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this.GetEnumerator(); } } } 解决方法
TakeWhile()和SkipWhile()都从序列的最开始开始,当条件不满足时停止进行/跳过.
// I've redesigned your ReekenReeks // [2,64,...,2**30] var reeks = Enumerable .Range(1,30) .Select(index => 1 << index); 例如,如果你放 var selection2 = reeks .TakeWhile(n => n < 1000 && n > 10); 因为臭气的第1项是2,所以条件n <1. 1000&& n> 10不符合TakeWhile停止并返回空序列.正确的实施是 var selection2 = reeks .SkipWhile(n => n <= 10) .TakeWhile(n => n < 1000); 如果要从序列中间切除值(selection3),则必须使用Where: var selection3 = reeks .Where(n => !(n > 1000 && n < 10)); // cut theses items off 打印出无限序列时要小心.Take()是一个不错的选择: var selection3 = reeks .Where(n => n > 1000 && n < 10) .Take(100); // First 100 items in case the sequence is too long (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |