2011-05-05 66 views
0

我有一個集合:如何在具有MultiDimensional Array內部列表的集合上實現IEnumerable <T>?

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

基本上它具有innerlist作爲具有IPIN實例在其各個[rowIndex位置,columnIndex]矩陣。

我想要實現的是能夠遍歷這個矩陣的所有IPin實例,

你可以建議我一個線程安全,簡單和快捷的方式來實現IEnumerable來實現這一目標嗎?

+1

查找yield語句。這與嵌套for循環相結合應該得到你想要的。 – 2011-05-05 07:32:31

回答

2

如果您的基礎屬性是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 

} 
1

如果數組是已知尺寸,例如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(); 
    } 
+0

+1,用於記錄對於foreach循環不需要IEnumerable。運行時實際上使用鴨子打字爲此:) – MattDavey 2011-05-05 07:46:07

+1

@MattDavey - 不,**編譯器**使用鴨子鍵入; p但實際上,在這種情況下它使用IEnumerable'(非通用)。 – 2011-05-05 08:05:33

相關問題