2016-06-13 8 views
0

私は以下でやりたいことを簡略化しました。私はSolarSystemクラスで使用されるクラスプラネットを持っています。私はforeachループを使ってSolarSystemの各惑星のorbitTimeInDaysを書きたいと思っています。C#列挙するオブジェクトforeach

エラーCS1579のforeach文はタイプ の変数に「TestEnum.SolarSystem」を操作することができない「TestEnum.SolarSystemは」「GetEnumeratorメソッド」

ため 公開定義が含まれていないため、問題は、列挙ですオブジェクトをEnumerableにするためのいくつかの記事や質問を読んだことがありますが、SolarSystemに適用する方法を考えることができないので、構築された各Planetを確認できます。 (最終的には小惑星なども含まれているので、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... 
    } 
} 
+2

問題は、あなたの惑星が同じクラスの個々のプロパティであることです。あなたはそれを少しでも魅力的に使うことができますが、実際にはソラールシステムの惑星のリストでもっとうまくいくでしょう。 – BugFinder

+0

'ForEach'ループは' for'ループと同様の方法で配列などに作用します。代わりに、いくつかのプロパティを持つ単一のクラスがあります。 –

答えて

5

あなたの太陽系で何かを繰り返すことはできません。

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

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return this.GetEnumerator(); 
    } 
} 

これは可算の基本的な実装です:あなたは、コンパイラに伝えるためにIEnumerableを実装する必要があります。 yieldキーワードを使用して、オンザフライで列挙子を生成します。

List<Planet> Planets {get;} = List<Planet>(); 

次にあなたがsolarSystem.Planetsを反復処理することができます。

必要に応じて、あなたはこのようなものはおそらく、あなたのクラスのプロパティPlanetsを作成することができます。

+0

ありがとう、これは私が必要としていたものです。 – FridgeMagnet

0

これはあなたのやり方と同じようにはできません。惑星の潜在的なプロパティを作成する代わりに、惑星のリスト/配列を作成することができます。このようにすれば、ソロシステムの外側から新しい惑星を作ることができます。あなただけのすべてのプロパティを列挙することはできません

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

    public Planet() { } 
} 

public class SolarSystem 
{ 
    public List<Planet> planets {get; private set;} 

    public SolarSystem() 
    { 
     planets = new List<Planet>(); 
     planets.Add(new Planet { name = "mercury", distanceFromEarth = 23456 }); 
     planets.Add(new Planet { name = "venus", distanceFromEarth = 12456 }); 
    } 
} 

static void Main(string[] args) 
{ 
    SolarSystem solarSystem = new SolarSystem(); 

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

:のような;-)

何か。

public class SolarSystem 
{ 
    public Dictionary<string, Planet> Planets { get; } = new Dictionary<string, Planet>(); 

    public SolarSystem() 
    { 
     Planets.add('Mercury', new Planet()); 
     Planets.add('Venus', new Planet()); 
     // etc... 
    } 
} 

そして、このように列挙する:

foreach (Planet planet in solarSystem.Planets.Values) 

辞書はあなたがすることができますあなたはこのような何かを得ることができるので、多分最善の解決策は、リストや惑星の辞書SolarSystemを与えることであろう名前で素早く惑星を見つけることができますが、それを必要としない場合は、代わりに名前をキーとする値(惑星)だけを含むListを使うことができます。名前をPlanetのプロパティにすることができます。そして、あなたが惑星を見つける必要があるとしても、それを見つけるための単純なループも良いです。結局のところ、あなたは太陽系内に何千もの惑星を持っていないので、ディクショナリーの高速探索の仕組みが必要ない。

リストの利点は、要素を追加する順序が保持されることです。 Dictonaryはありませんが、両方の機能が必要な場合に備えてOrderedDictionaryもあります。

とにかく、このようなコレクションクラスを使用すると、必要に応じて最適な方法でGetEnumerator(IEnumerableインターフェイスから)を実装する必要がなくなります。

+1

辞書を使用するのはなぜですか?それで 'List 'を使うのはなぜですか? –

+0

あなたもリストを使うことができます(これは私がテキストで提案したものです)。それは用途によって異なります。辞書を使うと、他のシナリオで名前で惑星を見つけることができます。 Linqもそうすることができますが、Dictionaryはより高速です。 – GolezTrol

+0

あなたの答えでそれを説明してください:) –

0

各惑星のオブジェクトを作成しています。 foreachはコレクションでのみ動作します。 より良い作成 リストplanetList =新しいリスト();

そしてそれをplanetListに追加してforeachを適用します。

関連する問題