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)
你的太阳系并没有告诉它可以迭代任何东西.你必须实现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.