繁体   English   中英

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

[英]How can I implement IEnumerable<T> on a collection that has a MultiDimensional Array inner list?

我有一个收藏:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM