如何在具有多维数组内部列表的集合上实现 IEnumerable
本文关键字:集合 实现 IEnumerable 列表 内部 数组 | 更新日期: 2023-09-27 17:55:22
我有一个集合:
interface IPinCollection : IEnumerable<IPin>
{
IPin this[int [,] indices] { get; set; }
}
基本上,它有一个内部列表作为矩阵,该矩阵在其每个[rowindex,columnIndex]中都有IPin实例。
我想要实现的是能够使用 for. 遍历此矩阵的所有 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();
}