2015-09-19 7 views
2

Мне нужно создать поле для простой игры. В первой версии поле было похоже на Point[,] - двухмерный массив.C# многомерный неизменяемый массив

Теперь мне нужно использовать System.Collections.Immutable (это важное условие). Я пытаюсь Google и не могу найти ничего, что может мне помочь. Я не понимаю, как я могу создать двумерный ImmutableArray (или ImmutableList)?

+0

Вы не можете. ImmutableArray и ImmutableList являются 1-мерными – lboshuizen

+3

@lboshuizen Возможно с зубчатыми массивами, хотя – Rob

+0

@lboshuizen, поэтому мне нужно использовать как: 'ImmutableArray >'? – gek0n

ответ

6

Существует не эквивалент прямоугольного массива, насколько я знаю, но вы можете:

  • Уже ImmutableList<ImmutableList<Point>>
  • Wrap один ImmutableList<Point> в своем собственном классе, чтобы обеспечить доступ через два измерения.

Последнее было бы что-то вроде:

// TODO: Implement interfaces if you want 
public class ImmutableRectangularList<T> 
{ 
    private readonly int Width { get; } 
    private readonly int Height { get; } 
    private readonly IImmutableList<T> list; 

    public ImmutableRectangularList(IImmutableList<T> list, int width, int height) 
    { 
     // TODO: Validation of list != null, height >= 0, width >= 0 
     if (list.Count != width * height) 
     { 
      throw new ArgumentException("..."); 
     } 
     Width = width; 
     Height = height; 
     this.list = list; 
    } 

    public T this[int x, int y] 
    { 
     get 
     { 
      if (x < 0 || x >= width) 
      { 
       throw new ArgumentOutOfRangeException(...); 
      } 
      if (y < 0 || y >= height) 
      { 
       throw new ArgumentOutOfRangeException(...); 
      } 
      return list[y * width + x]; 
     } 
    } 
} 
Смежные вопросы