如何在具有MultiDimensional Array内部列表的集合上实现IEnumerable <t>?</t>

时间:2011-05-05 07:23:40

标签: c# .net collections multidimensional-array ienumerable

我有一个集合:

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

基本上它有一个内部列表作为矩阵,在每个[rowindex,columnIndex]中都有IPin实例。

我想要实现的是能够使用for..each遍历此矩阵的所有IPin实例。

您能否建议我使用线程安全,简单快捷的方法来实现IEnumerable来实现这一目标?

2 个答案:

答案 0 :(得分:2)

如果你的底层属性是Array,你可以使用Array.GetLength(int dimension)来获取指定维度中数组的长度,尽管在这种情况下你可以简单地使用它的内置枚举器。 / p>

这有效,例如:

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 :(得分:1)

如果数组具有已知维度,例如private readonly IPin[,] data;,那么实际上非常简单(因为您已经可以foreach超过多维数组;但请注意T[*,*]没有' t 本身实施IEnumerable<T> - 因为技术不需要foreach):

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