2014-09-15 2 views
-1

제 계산 모델링을위한 데이터 구조를 2D 배열로 정의해야합니다. 추측 할 수 있듯이 첫 번째 관심사는 초기화, 반복 등의 관점에서의 성능입니다. 나는 위의 요구 사항에 대한 아이디어가 아래에 있습니다C#의 2D 동적 배열과 같은 컨테이너의 더 나은 구현

IList<IList<MyClass>> 

IList<MyClass> [,] 

나는이 언급 한 옵션 사이의 기술적 차이를 알고하는 경향입니다. 또한, 더 나은지도를 선택하기 위해 저를 설득하려고 시도 할 수도 있습니다 ...

+0

'IList의 는 [,]가 '실제로 당신이 이와 같은 구조를 사용할 수 등으로

'IList '객체의 2 차원 배열 ... 즉 3 차원 배열입니다. – Anthony

+0

첫 번째 목록의 목록입니다, 두 번째 목록의 2 차원 배열입니다 - 그들은 실제로 동일하지 않습니다. – knittl

+0

당신이 그들에 관해 나를 더 정확하게 가르쳐 줄 수 있다면 그것은 대단 할 것입니다 ... – Roboticist

답변

1

고정 치수가없는지도가 실제로 필요하다고 가정하면 기본 데이터 유형으로 사전을 사용하는 것이 가장 좋을 수 있습니다. 크기 조정에 너무 많은 시간을 할애해야합니다. 그래서 지금

class Map<T> 
{ 
    Dictionary<int, Dictionary<int, T>> map = 
     new Dictionary<int, Dictionary<int, T>>(); 
    public T this[int row,int column] 
    { 
     get { 
      Dictionary<int, T> rowDic; 
      if(!map.TryGetValue(row,out rowDic)) 
      { 
       return default(T); 
      } 
      T val; 
      if(!rowDic.TryGetValue(column, out val)) 
      { 
       return default(T); 
      } 
      return val; 
     } 
     set { 
      Dictionary<int, T> rowDic; 
      if(!map.TryGetValue(row,out rowDic)) 
      { 
       map[row] = new Dictionary<int, T>(); 
      } 
      map[row][column] = value; 
     } 
    } 
} 

를 그냥 2 차원 배열처럼 사용할 수 있습니다 :

var map = new Map<string>(); 
map[88,33] = "foo"; 
+0

@ 귀하의 일관된 효과적인 기여 ... 제안 된 유형을 뼈다귀로 이해하는 데 시간이 필요합니다. – Roboticist

+1

물론 메모리 요구 사항이 낮기 때문에 목록의 목록을 여기의 뒷받침 필드로 사용하는 것이 좋습니다. – spender