加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读