public static Cell[] GetValueCandidates(Board board, Cell cell) { var columnValues = board.GetAssignedColumnCells(cell); var rowValues = board.GetAssignedRowCells(cell); var gridValues = board.GetGridCells(cell) .Where(i => i.IsAssigned()) .ToArray(); var all = Cell.All; // BUG: "all" keeps bad positional value, corrupting board. var missingColumnValues = all.Except(columnValues).ToArray(); var missingRowValues = all.Except(rowValues) .ToArray(); var missingGridValues = all.Except(gridValues) .ToArray(); var candidates = missingColumnValues .Intersect(missingRowValues) .Intersect(missingGridValues) .ToArray(); return candidates; }