2011-05-05 3 views
0

MultiDimensional Array 내부 목록이있는 컬렉션에 IEnumerable <T>을 어떻게 구현할 수 있습니까?

컬렉션이 있습니다.

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

기본적으로 각 [rowindex, columnIndex]에는 IPin 인스턴스가있는 행렬로 innerlist가 있습니다.

내가 달성하고 싶은 것은 for..each를 사용하여이 행렬의 모든 IPin 인스턴스를 둘러 볼 수있는 것입니다.

나에게 이것을 달성하기 위해 IEnumerable을 구현하는 스레드 안전하고 간단하며 빠른 방법을 제안 해 주시겠습니까?

+1

는 yield 문을 검색합니다. 중첩 된 for 루프와 결합하면 원하는 것을 얻을 수 있습니다. –

답변

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[*,*]자체가 아니기 때문에은을 구현합니다- 그 기술적으로foreach에 대한 요구 사항)이 아니므 :

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

foreach 루프에 IEnumerable이 필요하지 않음을 문서화하기 위해 +1. 런타임에 실제로 이것을 위해 오리 타이핑을 사용합니다 :) – MattDavey

+1

@MattDavey - 아니, ** 컴파일러 **는 오리 유형 지정을 사용합니다. 그러나 실제로이 경우에는 IEnumerable (비 - 제네릭)을 사용하고 있습니다. –

관련 문제