C#实现一个迭代器

GK_2014 2015-06-10 04:32:49
刚刚学习C#,看着书上的例子敲代码,运行了下报错如下:
错误 1 “CH11Ex03.Primes”不包含“GetEnumerator”的公共定义,因此 foreach 语句不能作用于“CH11Ex03.Primes”类型的变量

这个控制台程序是找出2~100之间的素数,并打印出来。
下面是新建的Primes类

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CH11Ex03
{
public class Primes
{
private long min;
private long max;

public Primes(): this(2, 100)
{

}

public Primes(long Min, long Max)
{
if (min<2)
{
min = Min;
}
else
{
min = Min;
}
max = Max;
}

public IEnumerator GetIEnumerator()
{
for (long possiblePrimer = min; possiblePrimer <= max; possiblePrimer++ )
{
bool flag = true;
for (long factor = 2; factor < (long)Math.Floor(Math.Sqrt(possiblePrimer)); factor++)
{
if (0 == possiblePrimer%factor)
{
flag = false;
break;
}
}
if (flag)
{
yield return possiblePrimer;
}
}
}
}
}


下面这段是主程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CH11Ex03
{
class Program
{
static void Main(string[] args)
{
Primes myPrimes = new Primes(2, 100);
foreach (long num in myPrimes)
{
Console.Write("{0}", num);
}

Console.ReadKey();
}
}
}


请达人帮我看看哪里有问题?
...全文
420 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
GK_2014 2015-06-10
  • 打赏
  • 举报
回复
引用 3 楼 effun 的回复:
修改以下两个地方 public class Prims : IEnumerable public IEnumerator GetEnumerator();
谢谢!
superliu1122 2015-06-10
  • 打赏
  • 举报
回复
GetIEnumerator->GetEnumerator 拼写错误
  • 打赏
  • 举报
回复
for (long possiblePrimer = max + 1; 改为 for (long possiblePrimer = max + 1; .......................
  • 打赏
  • 举报
回复
实际上大多数时候,是需要判断一个数字是不是素数,而不是一遍地重复去枚举素数。重复枚举是低效率的。 比如说判断如此10个数字是不是素数,可以这样判断
using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var arr = new long[] { 1981, 186, 89, 73, 15, 3, 6, 17, 23, 53 };
            Primes myPrimes = new Primes();
            foreach(var i in arr)
            {
                if (myPrimes.IsPrim(i))
                    Console.Write("{0} ", i);
            }
            Console.WriteLine("___________按任意键结束");
            Console.ReadKey();
        }
    }

    public class Primes
    {
        public Primes()
        {
            Found.Add(2);
        }

        private List<long> Found = new List<long>();

        public bool IsPrim(long n)
        {
            var max = Found.Last();
            if (n > max)
            {
                for (long possiblePrimer = max; possiblePrimer <= n; possiblePrimer++)
                {
                    var top = (long)Math.Floor(Math.Sqrt(possiblePrimer));
                    foreach (var factor in Found)
                    {
                        if (factor > top)
                        {
                            Found.Add(possiblePrimer);
                            break;
                        }

                        if (0 == possiblePrimer % factor)
                            break;
                    }
                }
            }
            return Found.Contains(n);
        }
    }
}
这里没有特意做什么优化,但是先把算法搞好,它本身比仅仅去抠一两条语句的“优化”更重要。
  • 打赏
  • 举报
回复
你可以看 msdn 文档。如果不继承自 IEnumerable 接口,则需要那 4 条要求。在例子中,除了有 MyCollection 类以外,还有 MyEnumerator 类用来定义枚举规则。这才是编译器要的 GetIEnumerator() 方法(返回一个实现了枚举规则的复杂对象)。 而你的代码根本没有返回人家要的 GetIEnumerator() 方法! 实际上如果要写为简单形式,应该写
public class Primes
{
    private long min;
    private long max;

    public Primes()
        : this(2, 100)
    {

    }

    public Primes(long Min, long Max)
    {
        min = Min;
        max = Max;
    }

    private List<long> Found = new List<long>();

    public IEnumerable<long> All()
    {
        bool flag;
        for (long possiblePrimer = min; possiblePrimer <= max; possiblePrimer++)
        {
            var top = (long)Math.Floor(Math.Sqrt(possiblePrimer));
            flag = true;
            foreach (var factor in Found)
            {
                if (factor > top)
                    break;

                if (0 == possiblePrimer % factor)
                {
                    flag = false;
                    break;
                }
            }
            if (flag)
            {
                Found.Add(possiblePrimer);
                yield return possiblePrimer;
            }
        }
    }
}
effun 2015-06-10
  • 打赏
  • 举报
回复
修改以下两个地方 public class Prims : IEnumerable public IEnumerator GetEnumerator();
bdmh 2015-06-10
  • 打赏
  • 举报
回复
你的类要继承自System.Collections.IEnumerable,参考 http://www.cnblogs.com/eagle1986/archive/2011/12/05/2276293.html
  • 打赏
  • 举报
回复
https://msdn.microsoft.com/query/dev12.query?appId=Dev12IDEF1&l=ZH-CN&k=k(CS1579);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5)&rd=true 既然你选择这么繁琐的语法形式,你写的 public IEnumerator GetIEnumerator() 就差太多了。

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧