Как я могу реализовать IEnumerable <T>в коллекции, которая имеет внутренний список MultiDimensional Array? - PullRequest
0 голосов
/ 05 мая 2011

У меня есть коллекция:

interface IPinCollection : IEnumerable<IPin>
{
 IPin this[int [,] indices] { get; set; }
}

По сути, она имеет внутренний список в виде матрицы, в каждой из которых есть экземпляр IPin [rowindex, columnIndex].

Чего я хочу добиться, так этобыть в состоянии пройти через все экземпляры IPin этой матрицы с for..each.

Можете ли вы предложить мне потокобезопасный, простой и быстрый способ реализации IEnumerable для достижения этой цели?

Ответы [ 2 ]

2 голосов
/ 05 мая 2011

Если вашим базовым свойством является Array, вы можете использовать Array.GetLength(int dimension), чтобы получить длину массива в указанном измерении, хотя в этом случае вы можете просто использовать его встроенный перечислитель.

Это работает, например:

int[,] arr = new int[,] 
{ 
   { 1, 2, 3 },    
   { 4, 5, 6 },
   { 7, 8, 9 },
   { 10, 11, 12 } 
};

foreach (int i in arr)
   Console.WriteLine(i);

Это означает, что вы можете просто возвращать значения из массива в том порядке, в котором их перечислитель возвращает их:

class PinCollection : IPinCollection
{
     private IPin[,] _array;

     #region IEnumerable<int> Members

     public IEnumerator<int> GetEnumerator()
     {
         foreach (IPin i in _array)
             yield return i;
     }

     #endregion

     #region IEnumerable Members

     System.Collections.IEnumerator
         System.Collections.IEnumerable.GetEnumerator()
     {
         foreach (IPin i in _array)
             yield return i;
     }

     #endregion

}
1 голос
/ 05 мая 2011

Если массив имеет известную размерность, например private readonly IPin[,] data;, то на самом деле довольно просто (поскольку вы уже можете foreach над многомерным массивом; но учтите, что T[*,*] не сам по себе внедрить IEnumerable<T> - поскольку технически это не требование foreach):

    public IEnumerator<IPin> GetEnumerator()
    {
        foreach (IPin pin in pins) yield return pin;
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
...