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

时间:2015-05-16 14:34:51

标签: c# linq ienumerable

我正在尝试打印并获取一行数字(2,4,8,16,32),但是使用LINQ表达式时应该大于10但小于1000。我不知道自己做错了什么。

当我使用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();
    }
}

}

1 个答案:

答案 0 :(得分:5)

Linq(即您正在使用的IEnumerable<T>语法)要求您实现IEnumerable接口,而不是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(); } }

Take()

作为注释,您的枚举返回无限列表。因此,当您枚举它时,您需要使用TakeWhile()where等手动终止它。

使用var query = r.Where(i => i > 10) .TakeWhile(i => i < 1000) .Select(i => 2 * i); 将不会终止枚举,因为.NET框架不知道您的枚举器只发出增加的值,因此它将永远枚举(或直到您终止进程)。您可以尝试这样的查询:

{{1}}