11

私はこのようなことをしようとしましたが、これは機能しません:

    class Garage
    {
        private List<Car> cars = new List<Car>();

        public Car this[int i]
        {
            get { return cars[i]; }
        }
         //...
    }

       Garage g =  new Garage();
       //get CS1579 - no GetEnumerator definition
       foreach (Car c in g)
       {
           //...
       }

MSDNがインデクサーが過負荷になる可能性があると言っているので、ここで専門家に尋ねることにしました。foreachループと連携するためにインデクサーをオーバーロードする方法は?

4

2 に答える 2

40

foreachインデクサーとは何の関係もありません。GetEnumeratorコレクションの列挙子を返すメソッドを宣言する必要があります。(その間、このメソッドを提供するインターフェースも実装するのが賢明かもしれませんIEnumerable<Car>。)特定のケースでは、次のように簡単に行うことができます。

class Garage : IEnumerable<Car>
{
    private List<Car> cars = new List<Car>();

    public Car this[int i]
    {
        get { return cars[i]; }
    }

    // For IEnumerable<Car>
    public IEnumerator<Car> GetEnumerator() { return cars.GetEnumerator(); }

    // For IEnumerable
    IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
}

インターフェイスを実装することの大きな利点は、IEnumerable<Car>すべてのLINQ拡張メソッドを使用できることです。たとえばWhereSelect次のようになります。

var redCars = myGarage.Where(car => car.Color == CarColor.Red);
于 2010-09-22T12:26:27.790 に答える