[英]How can I add to an existing array/ienumerable collection in a foreach loop
[英]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.