Поменять местами элементы в двумерном массиве C # - PullRequest
1 голос
/ 21 марта 2011

Я использую C #, я довольно плохо знаком с языком, но раньше я использовал похожие языки, поэтому я понимаю основной синтаксис.

У меня есть двумерный массив типа Object. (X представляет, какое значение, а Y - это какая запись). Он хранит две строки в столбцах 0 и 1 и MessageBoxIcon в 2 и MessageBoxButtons в 3.

Я бы хотел поменять местами две записи.

Я заполняю listBox столбцом 1 каждый раз, когда в массив вносятся изменения. (используя цикл) Я доволен этой системой. Я поместил кнопки + и - сбоку списка, но не могу понять, как сделать код, стоящий за ним.

Я хочу, чтобы при нажатии кнопки «+» текущая выбранная запись увеличивалась на одну запись. (Т.е. это уменьшает его местоположение Y и увеличивает координату Y записи над ним). Необходимо увеличить все значения, связанные с этой записью.

Может ли кто-нибудь предоставить мне функцию для этого?

Надеюсь, я объяснил это достаточно хорошо.

1 Ответ

1 голос
/ 21 марта 2011

Это нужно будет сделать по-старому, чтобы поменять местами значения двух переменных:

var t = a;
a = b;
b = t;

Но, если a и b являются строками массива 2d, это нужно делать по одному элементу за раз.

public void Swap2DRows(Array a, int indexOne, int indexTwo) {
  if (a == null} { throw new ArgumentNullException("a"); }
  if (a.Rank != 2) { throw new InvalidOperationException("..."); }

  // Only support zero based:
  if (a.GetLowerBound(0) != 0) { throw new InvalidOperationException("..."); }
  if (a.GetLowerBound(1) != 0) { throw new InvalidOperationException("..."); }

  if (indexOne >= a.GetUpperBound(0)) { throw new InvalidOperationException("..."); }
  if (indexTwo >= a.GetUpperBound(0)) { throw new InvalidOperationException("..."); }

  for (int i = 0; i <= a.GetUpperBound(1); ++i) {
    var t = a[indexOne, i];
    a[indexOne, i] = a[indexTwo, i];
    a[indexTwo, i] = t;
  }
}

Это можно обобщить для обработки произвольных нижних границ.

...