C#枚举对象foreach

Fri*_*net 0 c# foreach enumeration enumerate

我有一个简化版本,我想在下面做.我有一个由SolarSystem类使用的类Planet.我想使用foreach循环为SolarSystem中的每个Planet编写orbitTimeInDays.

错误CS1579 foreach语句无法对"TestEnum.SolarSystem"类型的变量进行操作,因为"TestEnum.SolarSystem"不包含"GetEnumerator"的公共定义

问题是枚举,我已经阅读了几篇关于使对象可枚举的文章和问题,但我似乎无法弄清楚如何将它应用于SolarSystem,因此我可以检查它构造的每个星球.(最终它也将包含小行星等,所以它不仅仅是8个行星和冥王星.)

有人可以帮我理解如何枚举SolarSystem.

class Program
{
    static void Main(string[] args)
    {
        SolarSystem solarSystem = new SolarSystem();
        solarSystem.mercury.orbitTimeInDays = 88;
        solarSystem.venus.orbitTimeInDays = 225;
        // etc...

        foreach (Planet planet in solarSystem)
        {
            Console.WriteLine("Time taken to orbit sun (in days) : " + planet.orbitTimeInDays.ToString());
        }
    }
}

public class Planet 
{
    public double distanceFromEarth { get; set; }
    public int orbitTimeInDays { get; set; }
    // etc...

    public Planet() { }
}

public class SolarSystem 
{ 
    public Planet mercury { get; set; }
    public Planet venus { get; set; }
    // etc...

    public SolarSystem()
    {
        mercury = new Planet();
        venus = new Planet();
        // etc...
    }
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*man 5

你的太阳系并没有告诉它可以迭代任何东西.你必须实现IEnumerable告诉编译器:

public class SolarSystem : IEnumerable<Planet>
{
    public IEnumerator<Planet> GetEnumerator()
    {
        yield return mercury;
        yield return venus;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是可枚举的基本实现.它使用yield关键字为您即时生成枚举器.

或者,您可以Planets在类中创建一个属性,可能是这样的:

List<Planet> Planets {get;} = List<Planet>();
Run Code Online (Sandbox Code Playgroud)

然后你可以迭代solarSystem.Planets.