/// <summary> /// This method will return the list of cells that meet the specification. /// <param name="cell"> source cell, whose neighbours need to find </param> /// <param name="specification">Actual specification, which need to pass by neighbours. </param> /// <returns>return the cell collection which pass the specification. </returns> public ICollection<Cell> FindNeighbourCells(Cell cell, ISpecification<Cell> specification) { if(cell == null) throw new ArgumentNullException("Cell can't be empty"); List<Cell> cells = new List<Cell>(); int startRow; int startCol; int endRow; int endCol; int colIndex = cell.ColNumber; int rowIndex = cell.RowNumber; GetValidStartRowAndCol(rowIndex, colIndex, out startRow, out startCol); GetValidEndRowAndCol(rowIndex, colIndex, out endRow, out endCol); for (int xcoord = startRow; xcoord <= endRow; xcoord++) { for (int ycoord = startCol; ycoord <= endCol; ycoord++) { if (!(xcoord == rowIndex && ycoord == colIndex)) { if (specification == null) cells.Add(grid[xcoord, ycoord]); else if (specification.IsSpecificationMeet(grid[xcoord, ycoord])) cells.Add(grid[xcoord, ycoord]); } } } return cells; }