如何在具有多维数组内部列表的集合上实现 IEnumerable

本文关键字:集合 实现 IEnumerable 列表 内部 数组 | 更新日期: 2023-09-27 17:55:22

我有一个集合:

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

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

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

你能给我建议一种线程安全、简单快捷的方法来实现 IEnumerable 来实现这一点吗?

如何在具有多维数组内部列表的集合上实现 IEnumerable<T>

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

如果数组是已知维度的,例如 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();
    }