2D нарезка массива - PullRequest
       12

2D нарезка массива

1 голос
/ 16 марта 2020

из-за того, что теперь есть возможность нарезать массив с хитрым пиковым способом, как arr[1..4] Я хотел нарезать 2D-массив.

Учтите следующее:

int[][] matrix = new int[4][]
{
    new int[] {1,2,3,4 },
    new int[] {5,6,7,8 },
    new int[] {9,10,11,12 },
    new int[] {13,14,15,16 }
};

foreach (var item in matrix[0..2][0..2].SelectMany(x => x))
{
    Console.Write(item + " ");
}
// output: 1 2 3 4 5 6 7 8 

foreach (var item in matrix[0..3][0..2].SelectMany(x => x))
{
    Console.Write(item + " ");
}
// output: 1 2 3 4 5 6 7 8


foreach (var item in matrix[0..1][0..2].SelectMany(x => x))
{
    Console.Write(item + " ");
}
// Error : System.ArgumentOutOfRangeException: 'Specified argument was out of the range of valid values

Я ожидаю, что первый вывод будет 1 2 5 6, второй 1 2 5 6 9 10 и третий 1 2.

Как я могу сделать это "способом нарезки" для достижения ожидаемого результата?

PS это я или это нелогичное поведение.

Ответы [ 2 ]

2 голосов
/ 16 марта 2020

Когда вы делаете это:

var slice = matrix[0..2][0..2];

Вы фактически нарезаете свой массив дважды . Это эквивалентно записи:

var temp = matrix[0..2];
var slice = temp[0..2];

, что в данном случае делает второй срез избыточным. Вы можете подтвердить это, написав:

var slice = matrix[0..2][0..3]

В этом случае второй фрагмент вызовет исключение, потому что он больше, чем первый фрагмент.

Что я думаю, вы пытаетесь сделать это:

foreach (var item in matrix[0..2].SelectMany(x => x[0..2]))
{
}
2 голосов
/ 16 марта 2020

Этот будет работать ... вам нужно срезать каждую строку в подмножестве, сгенерированном из первого среза, а не сам набор строк:

matrix[0..3].SelectMany(r => r[0..2])

Индекс среза действует на коллекцию и создает новую коллекцию, в отличие от скалярного индексирования, которое возвращает один элемент коллекции. В результате индексирование теперь снова действует на слайс, а не на элемент внутри слайса ... поэтому вам нужно использовать select для применения к каждому элементу.

...