Динамическая 2D структура для C # - PullRequest
2 голосов
/ 09 февраля 2009

Я работаю над классом, который хранит двумерный массив класса MyType и хотел бы, чтобы он использовал динамические типы данных. т.е. не MyType[,]

Проблема с MyType[,] заключается в том, что класс не знает размер массива заранее, и я не хочу заниматься проблемой изменения размера массива, если это было сделано в другом месте в .NET Framework.

Класс не будет знать максимальный размер массива в любой момент, но массив будет плотным. Я знаю, что могу использовать статические массивы и перераспределять память по мере необходимости, но я бы предпочел использовать встроенную реализацию, если это возможно.

Есть ли что-нибудь лучше, чем List<List<MyType>> для этой цели?

Редактировать 1: указано, что массив плотный;

Редактировать 2 и 3: указанная проблема с MyType[,]

Ответы [ 3 ]

4 голосов
/ 09 февраля 2009

Создайте свою собственную List<List<T>> инкапсуляцию, например:

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]; }
   }
   ....
}

определите свой собственный набор операций над ним! Будь свободен!

Инкапсулируя его, вы можете решить перейти к более оптимизированной реализации позже, если этого недостаточно.

        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 голос
/ 09 февраля 2009

Для плотной 2D матрицы идеально подходит прямоугольный массив. В чем проблема с SomeType[,]? Обратите внимание, что вы можете создавать динамические массивы либо с помощью Array.CreateInstance(type, dim0Size, dim1Size), либо с помощью шаблонов:

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

(возможно, используя MakeGenericMethod, если вы хотите использовать специальные типы)

1 голос
/ 09 февраля 2009

Это зависит от того, насколько разреженной будет ваша структура. Например, если ваши записи будут похожи на myTypes[0, 1] и myTypes[134, 544], вам будет гораздо лучше использовать разреженную матрицу . В противном случае List<List<MyType>> подойдет.

...