2011-05-05 65 views
0

我有一个集合:如何在具有MultiDimensional Array内部列表的集合上实现IEnumerable <T>?

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

基本上它具有innerlist作为具有IPIN实例在其各个[rowIndex位置,columnIndex]矩阵。

我想要实现的是能够遍历这个矩阵的所有IPin实例,

你可以建议我一个线程安全,简单和快捷的方式来实现IEnumerable来实现这一目标吗?

+1

查找yield语句。这与嵌套for循环相结合应该得到你想要的。 – 2011-05-05 07:32:31

回答

2

如果您的基础属性是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

如果数组是已知尺寸,例如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(); 
    } 
+0

+1,用于记录对于foreach循环不需要IEnumerable。运行时实际上使用鸭子打字为此:) – MattDavey 2011-05-05 07:46:07

+1

@MattDavey - 不,**编译器**使用鸭子键入; p但实际上,在这种情况下它使用IEnumerable'(非通用)。 – 2011-05-05 08:05:33

相关问题