Как я могу вернуть индекс объекта в 2-мерном массиве? - PullRequest
1 голос
/ 15 октября 2010

Я работаю с двумерным массивом обнуляемых логических значений bool?[,]. Я пытаюсь написать метод, который будет циклически проходить по его элементам 1, начиная с верхней части, и для каждого индекса, который является нулевым, он будет возвращать индекс.

Вот что у меня есть:

public ITicTacToe.Point Turn(bool player, ITicTacToe.T3Board game)
{
    foreach (bool? b in grid)
    {
        if (b.HasValue == false)
        {                      
        }
        if (b.Value == null)
        {
        }


    }
    return new Point();

 }

Я хочу иметь возможность установить объект на true/false в зависимости от переданного bool. Point это просто класс с x,y.

Какой отличный способ написать этот метод?

Ответы [ 2 ]

2 голосов
/ 15 октября 2010

Вы должны использовать обычный цикл for и метод .GetLength(int).

public class Program
{
    public static void Main(string[] args)
    {
        bool?[,] bools = new bool?[,] { { true, null }, { false, true } };

        for (int i = 0; i < bools.GetLength(0); i++)
        {
            for (int j = 0; j < bools.GetLength(1); j++)
            {
                if (bools[i, j] == null)
                    Console.WriteLine("Index of null value: (" + i + ", " + j + ")");
            }
        }
    }
}

Параметр для .GetLength(int) является измерением (то есть в [x,y,z], Вы должны передать 0 для длины измерения x, 1 для y и 2 для z.)

1 голос
/ 15 октября 2010

Просто для удовольствия, вот версия, которая использует LINQ и анонимные типы. Магия заключается в выражении SelectMany, которое преобразует наш вложенный массив в IEnumerable<> анонимного типа с координатами X и Y и значением в ячейке. Я использую форму Select и SelectMany, которая предоставляет индекс для облегчения получения X и Y.

статические

 void Main(string[] args)
 {
     bool?[][] bools = new bool?[][] { 
         new bool?[] { true, null }, 
         new bool?[] { false, true } 
     };
     var nullCoordinates = bools.
         SelectMany((row, y) => 
             row.Select((cellVal, x) => new { X = x, Y = y, Val = cellVal })).
         Where(cell => cell.Val == null);
     foreach(var coord in nullCoordinates)
         Console.WriteLine("Index of null value: ({0}, {1})", coord.X, coord.Y);
     Console.ReadKey(false);
 }
...