【问题标题】:How can I implement IEnumerable<T> on a collection that has a MultiDimensional Array inner list?如何在具有多维数组内部列表的集合上实现 IEnumerable<T>?
【发布时间】:2011-05-05 07:23:40
【问题描述】:

我有一个收藏:

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

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

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

您能否建议我一种线程安全、简单且快速的方法来实现 IEnumerable 以实现此目的?

【问题讨论】:

  • 查看产量声明。结合嵌套的 for 循环应该可以得到你想要的。

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


【解决方案1】:

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

}

【讨论】:

    【解决方案2】:

    如果数组是已知维度的,例如private readonly IPin[,] data;,那么实际上非常简单(因为您已经可以在多维数组上使用foreach;但请注意T[*,*] 本身并不 /em> 实现IEnumerable&lt;T&gt; - 因为这不是技术上 foreach 的要求):

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

    【讨论】:

    • +1 用于记录 foreach 循环不需要 IEnumerable。运行时实际上为此使用了鸭子类型:)
    • @MattDavey - 不,编译器使用鸭子类型;p 但实际上,在这种情况下,它使用的是IEnumerable(非泛型)。
    猜你喜欢
    • 1970-01-01
    • 2010-09-21
    • 2015-03-12
    • 2011-11-25
    • 2012-07-03
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多