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

发布于 2024-11-05 15:29:15 字数 301 浏览 1 评论 0原文

我有一个集合:

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

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

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

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

I have a collection:

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

Basically it has an innerlist as matrix which has IPin instance in its each [rowindex,columnIndex].

What I want to achieve is to be able to walkthrough the all IPin instances of this matrix with for..each.

Can you suggest me a thread-safe,simple and quick way to implement IEnumerable to achieve this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

风柔一江水 2024-11-12 15:29:15

如果您的基础属性是Array,则可以使用Array.GetLength(intDimension) 获取指定维度中数组的长度,尽管在这种情况下您可以简单地使用其内置枚举器。

这是有效的,例如:

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

}

If your underlying property is an Array, you can use Array.GetLength(int dimension) to get the length of the array in the specified dimension, although in that case you can simply use its built-in enumerator.

This works, for example:

int[,] arr = new int[,] 
{ 
   { 1, 2, 3 },    
   { 4, 5, 6 },
   { 7, 8, 9 },
   { 10, 11, 12 } 
};

foreach (int i in arr)
   Console.WriteLine(i);

It means you can simply return values from the array, in the order its enumerator returns them:

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

}
蓝梦月影 2024-11-12 15:29:15

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

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

If the array is of known dimension, for example private readonly IPin[,] data;, then actually pretty simply (since you can already foreach over a multi-dimensional array; but note that T[*,*] doesn't itself implement IEnumerable<T> - since that isn't technically a requirement for foreach):

    public IEnumerator<IPin> GetEnumerator()
    {
        foreach (IPin pin in pins) yield return pin;
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文