public static IEnumerable <CellPosition> EnumeratePositions <T>(this IRectangularReadonlyField <T> field) { return (from row in Enumerable.Range(0, field.Size.Height) from column in Enumerable.Range(0, field.Size.Width) select new CellPosition(row, column)); }
private static void ColorCells <T>(Rectangle[,] cells, IRectangularReadonlyField <T> field, Func <T, Brush> getBrush) { foreach (var position in field.EnumeratePositions()) { cells.GetValue(position).Fill = getBrush(field[position]); } }
public static string ToString <T>(this IRectangularReadonlyField <T> field, Func <T, char> getSymbol) { var rows = Enumerable.Range(0, field.Size.Height) .Select(x => new char[field.Size.Width]) .ToArray(); foreach (var position in field.EnumeratePositions()) { rows[position.Row][position.Column] = getSymbol(field[position]); } return(string.Join("\n", rows.Select(row => new string(row)))); }
public static IEnumerable <CellPosition> FindAllConnectedByEdgeCells <T>( this IRectangularReadonlyField <T> field, CellPosition start, Predicate <T> canBeVisited) { var visited = new HashSet <CellPosition> { start }; var queue = new Queue <CellPosition>(); queue.Enqueue(start); while (queue.Any()) { var current = queue.Dequeue(); var ways = current.ByEdgeNeighbours .Where(x => field.Contains(x) && !visited.Contains(x) && canBeVisited(field[x])); foreach (var connected in ways) { visited.Add(connected); queue.Enqueue(connected); } } return(visited); }
public static bool Contains <T>(this IRectangularReadonlyField <T> field, CellPosition cell) { return (cell.Row.IsInRange(0, field.Size.Height) && cell.Column.IsInRange(0, field.Size.Width)); }