找不到源类型的查询模式的实现



我试图打印并获得一行数字(2,4,8,16,32,),但随后应该大于10但小于1000与LINQ表达式。我不知道我做错了什么。

当我使用from时,错误发生在我的program.cs中,它强调了r.我不明白这个错误是什么意思。

program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 namespace _3._4
 {
    class Program
{
    static void Main(string[] args)
    {
        Reeks r = new Reeks();
      var query =
                     from i in r// error is here
                     where i > 10 && i < 1000
                     select 2 * i;
        foreach (int j in query)
        {
            Console.Write(j);

        }
    }
}

}

Reeks.cs:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace _3._4
 {
    class Reeks : IEnumerable
{
    private int i = 1;
    public Reeks() {  }
    public IEnumerator GetEnumerator()
    {
        while (true)
        {
            i = i * 2;
            yield return i;
        }
    }
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

}

Linq(即您正在使用的from i in r语法)要求您实现IEnumerable<T>接口,而不是IEnumerable。因此,正如Lee指出的那样,您可以像这样实现IEnumerable<int>:

class Reeks : IEnumerable<int>
{
    private int i = 1;
    public Reeks() {  }
    public IEnumerator<int> GetEnumerator()
    {
        while (true)
        {
            i = i * 2;
            yield return i;
        }
    }
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

需要注意的是,enumerable返回一个无限列表。因此,当您枚举它时,您需要使用Take()TakeWhile()之类的东西手动终止它。

使用where不会终止枚举,因为。net框架不知道你的枚举器只发出递增的值,所以它会永远枚举下去(或者直到你终止进程)。您可以尝试这样的查询:

var query = r.Where(i => i > 10)
                      .TakeWhile(i => i < 1000)
                      .Select(i => 2 * i);

相关内容

  • 没有找到相关文章