using System.Collections.Generic;
public static void Main()
Random rand = new Random();
num = Convert.ToInt32(Console.ReadLine());
Func<int> valueGenerator = () => { return rand.Next(0,2); };
var dungeon = new Grid<int>(num, num, valueGenerator);
foreach(var row in dungeon.Rows)
if (row.First().Row == 0)
Console.WriteLine("#-#-#-#-#");
var rowValues = row.Select(r => r.Value.ToString()).ToArray();
var rowDisplay = string.Join("|", rowValues);
Console.WriteLine($"|{rowDisplay}|");
Console.WriteLine("#-#-#-#-#");
private int _numberOfRows;
private int _numberOfColumns;
private List<Cell<T>> _cells;
public Grid(int numberOfRows, int numberOfColumns)
throw new ArgumentOutOfRangeException("numberOfRows must be greater than zero.");
if (numberOfColumns == 0)
throw new ArgumentOutOfRangeException("numberOfColumns must be greater than zero.");
_numberOfRows = numberOfRows;
_numberOfColumns = numberOfColumns;
_cells = Enumerable.Range(0, _numberOfRows)
.Select(r => Enumerable.Range(0, _numberOfColumns)
public Grid(int numberOfRows, int numberOfColumns, Func<T> valueGenerator)
throw new ArgumentOutOfRangeException("numberOfRows must be greater than zero.");
if (numberOfColumns == 0)
throw new ArgumentOutOfRangeException("numberOfColumns must be greater than zero.");
_numberOfRows = numberOfRows;
_numberOfColumns = numberOfColumns;
_cells = Enumerable.Range(0, _numberOfRows)
.Select(r => Enumerable.Range(0, _numberOfColumns)
public IEnumerable<ICell<T>> Cells
public IEnumerable<IEnumerable<ICell<T>>> Rows
return _cells.GroupBy(c => c.Row)
.Select(gs => gs.OrderBy(g => g.Col).ToList())
public IEnumerable<IEnumerable<ICell<T>>> Columns
return _cells.GroupBy(c => c.Col)
.Select(gs => gs.OrderBy(g => g.Row).ToList())
public interface ICell<T>
private class Cell<T> : ICell<T>
public T Value { get; set; }
public int Row { get; set; }
public int Col { get; set; }