2009-02-09 1 views
2

클래스 MyType의 2D 배열을 저장하는 클래스에서 작업 중이며 동적 데이터 형식을 사용하고 싶습니다. ie not MyType[,]C#의 동적 2D 구조

MyType[,]의 문제점은 클래스가 미리 배열의 크기를 알지 못한다는 것과 그 배열이 다른 곳에서 수행 되었다면 어레이 크기 조정을 관리하는 문제로 가고 싶지 않다는 것입니다. .NET Framework에서.

클래스는 주어진 순간에 최대 배열 크기를 알 수 없지만 배열은 밀집합니다. 정적 배열을 사용할 수 있고 필요에 따라 메모리를 다시 할당 할 수 있지만 가능하면 기본 제공 구현을 사용하는 것을 선호합니다.

이 목적으로 List<List<MyType>>보다 좋은 점이 있습니까?

편집 1 : 배열이 밀집한 것으로 지정되었습니다.

편집 2와 3 : 그것은 당신의 구조가 얼마나 스파 스에 따라 MyType[,]

+0

그것은 도움이 될 것이다 (당신이 임시 유형을 사용하려면 아마도 MakeGenericMethod를 사용하여) "더 나은"정의 : –

+0

을 내 요구에 더 적합합니다. 나는 성능과 바퀴의 재발견간에 현명한 균형을 원한다. 감사. – biozinc

+0

다시 편집 2 : 아니, 그렇지 않았습니다. 당신은 "MyType [,]"이 아니라고 말했지만 왜 * 왜 *를 말하지 않았습니다. 당신이 우리에게 문제를 말해 준다면, 우리는 그것을 고칠 기회가 더 많을 것입니다 ... –

답변

4

처럼 자신의 List<List<T>> 캡슐화를 만들기! 자유 라라!

캡슐화하면 충분하지 않은 경우 나중에 최적화 된 구현을 위해 결정할 수 있습니다.

 ICollection<T> rowOne = (ICollection<T>)new List<Int64>(); 
     rowOne.Add(1); 
     rowOneList.Add(2); 
     rowOne.Add(3); 

     ICollection<T> rowTwo = (ICollection<T>)new List<Int64>(); 
     rowTwo .Add(4); 
     rowTwo .Add(5); 
     rowTwo .Add(6); 
1

에 지정 문제. 예를 들어 항목이 myTypes[0, 1]myTypes[134, 544]과 비슷할 경우 sparse matrix을 사용하는 것이 좋습니다. 그렇지 않으면 List<List<MyType>>이됩니다.

public class Matrix<T> 
{ 
    List<List<T>> matrix; 

    public void Add(IEnumerable<T> row) 
    { 
     List<T> newRow = new List<T>(row); 
     matrix.Add(newRow); 
    } 

    public T this[int x, int y] 
    { 
     get { return matrix[y][x]; } 
    } 
    .... 
} 

그것을 작동 자신의 세트를 정의 :

1

밀도가 높은 2D 매트릭스의 경우 직사각형 배열이 이상적입니다. SomeType[,]으로 인해 발생한 문제는 무엇입니까? 당신도 Array.CreateInstance(type, dim0Size, dim1Size), 또는 제네릭 동적 배열을 만들 수 있습니다 :

void DoWork<T>(...) { 
    T[,] data = ... 
} 
DoWork<Foo>(...); 
DoWork<Bar>(...); 

+0

문제를 편집 할 때 SomeType [,]에 대한 제 문제를 분명히했습니다. – biozinc