自定义随机可枚举?

时间:2012-12-17 14:06:08

标签: c# random ienumerable

我有一个班级Rectangle,其中有一个方法RandomPoint会在其中返回一个随机点。它看起来像:

class Rectangle {
    int W,H;
    Random rnd = new Random();

    public Point RandomPoint() {
        return new Point(rnd.NextDouble() * W, rnd.NextDouble() * H);
    }
}

但我希望它是IEnumerable<Point>,以便我可以使用LINQ,例如rect.RandomPoint().Take(10)

如何简洁地实施?

3 个答案:

答案 0 :(得分:12)

您可以使用迭代器块:

class Rectangle
{
    public int Width { get; private set; }
    public int Height { get; private set; }

    public Rectangle(int width, int height)
    {
        this.Width = width;
        this.Height = height;
    }

    public IEnumerable<Point> RandomPoints(Random rnd)
    {
        while (true)
        {
            yield return new Point(rnd.NextDouble() * Width,
                                   rnd.NextDouble() * Height);
        }
    }
}

答案 1 :(得分:7)

IEnumerable<Point> RandomPoint(int W, int H)
{
    Random rnd = new Random();
    while (true)
        yield return new Point(rnd.Next(0,W+1),rnd.Next(0,H+1));
}

答案 2 :(得分:1)

yield可以是一个选项;

public IEnumerable<Point> RandomPoint() {
    while (true)
    {
        yield return new Point(rnd.NextDouble() * W, rnd.NextDouble() * H);
    }