我有一个集合:
interface IPinCollection : IEnumerable<IPin>
{
IPin this[int [,] indices] { get; set; }
}
基本上它有一个内部列表作为矩阵,在每个[rowindex,columnIndex]中都有IPin实例。
我想要实现的是能够使用for..each遍历此矩阵的所有IPin实例。
您能否建议我使用线程安全,简单快捷的方法来实现IEnumerable来实现这一目标?
答案 0 :(得分:2)
如果你的底层属性是Array
,你可以使用Array.GetLength(int dimension)
来获取指定维度中数组的长度,尽管在这种情况下你可以简单地使用它的内置枚举器。 / p>
这有效,例如:
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
}
答案 1 :(得分:1)
如果数组具有已知维度,例如private readonly IPin[,] data;
,那么实际上非常简单(因为您已经可以foreach
超过多维数组;但请注意T[*,*]
没有' t 本身实施IEnumerable<T>
- 因为技术不需要foreach
):
public IEnumerator<IPin> GetEnumerator()
{
foreach (IPin pin in pins) yield return pin;
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}