Устройте Многомерные массивы к спуску или возрастанию

Я пытаюсь устроить этот многомерный массив к возрастанию или спуску. Однако мне нужно отношение между колонкой 1 и 2, чтобы все еще быть вместе (значение, что я нуждаюсь в данных, например, выстраиваю [0,1] и выстраиваю [0,2], чтобы быть вместе или связан так или иначе. Это - мои коды с прямо сейчас.

int[,] time = new int[5,2]{{0,4},{1,5},{5,10},{3,4},{0,2}};
var sorted = from x in Enumerable.Range(0, time.GetLength(0))
                     from y in Enumerable.Range(0, time.GetLength(1))
                     select new{
                         X = x,
                         Y = y,
                         Value = time[x,y]
                    }into point
                    orderby point.Value descending
                    select point;

Это работает, но это разделяет все мои данные обособленно. Есть ли способ сортировать их, держа отношение колонки 1 и 2 вместе?

3
Не уверенный я понимаю что you' ре, пытающееся достигнуть. Можно ли показать нам желаемую продукцию?
добавлено автор Artless, источник

6 ответы

Мне любопытно относительно того, почему вам нужен многомерный массив. Ясно, что вы рассматриваете свои данные как одно-мерную коллекцию "рядов", а не 2-мерную коллекцию "клеток".

Почему не просто делают a Список (T), где T - своего рода Кортеж или таможенная структура?

На поверхности кажется, что вы пытаетесь использовать отвертку на гвозде; удостоверьтесь, что вы выбираете правильный инструмент для работы;)

5
добавлено
Я ценю ваше большое использование английских слов, печально это doesn' t помощь, и мне нравится использовать множества. Так да.
добавлено автор Bocky, источник

Это кажется, что вы хотите хранить свои данные в многомерном массиве, но держать каждый ряд во множестве как отдельная атомная единица. И дополнительно, сравнение каждого "пункта" X, и затем Y.

int[,] time = new int[5, 2] { { 0, 4 }, { 1, 5 }, { 5, 10 }, { 3, 4 }, { 0, 2 } };

var sorted = from x in Enumerable.Range(0, time.GetLength(0))
                     select new Point()
                     {
                         X = time[x,0],
                         Y = time[x,1]
                     } into point
                     orderby point.X ascending , point.Y ascending 
                     select point;

int[,] sortedTime = new int[5,2];
int index = 0;
foreach (var testPoint in sorted)
{
  Point aPoint = (Point) testPoint;
  sortedTime.SetValue(aPoint.X, index, 0);
  sortedTime.SetValue(aPoint.Y, index, 1);

  index++;
}
2
добавлено
Это полезно, но я мог получить просто другую помощь, прежде чем я буду награждать щедрость? Я должен хранить эти обработанные данные о варе в другой многомерный массив, но я понятия не имею, как сделать это.
добавлено автор Bocky, источник
Я обновил пример кода выше, чтобы преобразовать набор Точечных объектов назад в новое 2D множество. Это все немного изобретено и могло, вероятно, быть оптимизировано с лучшим пониманием фактических требований, но должно хорошо работать для вашего примера.
добавлено автор Gambit, источник

Самый быстрый метод должен был бы взять внедрение некоторого алгоритма сортировки, любят Quicksort и изменяют, это, чтобы только использовать Выдерживает сравнение (я, j) и Обмен (я, j) функции. Тогда можно осуществить эти функции для многомерного массива и сортировать его в месте. Вот рабочее внедрение:

    public static void Main() {
        int[,] time = new int[5, 2] { { 0, 4 }, { 1, 5 }, { 5, 10 }, { 3, 4 }, { 0, 2 } };
        DoSort(time);
    }

    public static void DoSort(int[,] data) {
        Func comparer = (i, j) => {
            int s1 = Math.Sign(data[i, 0] - data[j, 0]);
            if (s1 != 0) {
                return s1;
            }
            int s2 = Math.Sign(data[i, 1] - data[j, 1]);
            return s2;
        };

        Action swapper = (i, j) => {
            var tmp0 = data[i, 0];
            var tmp1 = data[i, 1];
            data[i, 0] = data[j, 0];
            data[i, 1] = data[j, 1];
            data[j, 0] = tmp0;
            data[j, 1] = tmp1;
        };

        int length = data.GetLength(0);
        Quicksort(comparer, swapper, 0, length - 1);
    }

    public static void Quicksort(Func comparer, Action swapper, int left, int right) {
        int i = left, j = right;
        int pivotIdx = (left + right)/2;

        while (i <= j) {
            while (comparer(i, pivotIdx) < 0) {
                i++;
            }

            while (comparer(j, pivotIdx) > 0) {
                j--;
            }

            if (i <= j) {
                swapper(i, j);
                i++;
                j--;
            }
        }

       //Recursive calls
        if (left < j) {
            Quicksort(comparer, swapper, left, j);
        }

        if (i < right) {
            Quicksort(comparer, swapper, i, right);
        }
    }
}

Этот код сортирует множество, оперативное, таким образом, вам не нужна никакая дополнительная память, и в конце вы получаете сортированный многомерный массив.

0
добавлено

Я также думаю, что нужно рассматривать это как коллекцию рядов, так как вы хотите, чтобы ряды всегда остались вместе. У.NET есть DataTable тип для этого. Например.

        int[,] time = new int[5, 2] { { 0, 4 }, { 1, 5 }, { 15, 10 }, { 3, 4 }, { 0, 2 } };

        DataTable dt = new DataTable();

        dt.Columns.Add("x", System.Type.GetType("System.Int32"));
        dt.Columns.Add("y", System.Type.GetType("System.Int32"));

        for (int i = 0; i < time.Length/2; i++)
        {
            DataRow dr = dt.NewRow();
            dr[0] = time[i, 0];
            dr[1] = time[i, 1];
            dt.Rows.Add(dr);
        }

        dt.DefaultView.Sort = "x" + " " + "ASC";
        dt = dt.DefaultView.ToTable();

Note that I needed to type the table columns. Otherwise you'll get an alphabetical sort. I changed one of your numbers to 15 to demonstrate that the sort works on the integers (15>3, but alphabetically "15"<"3"). If you really want it back as a 2D array, see the first answer.

0
добавлено

Похоже, что вы могли бы просто сверхдумать вещи. Если вы хотите держать пункты вместе, и вид первой колонкой, например, просто опускает второе Счетный . Диапазон и назначает ценности вручную:

int[,] time = new int[5,2]{{0,4},{1,5},{5,10},{3,4},{0,2}};
var sorted = from x in Enumerable.Range(0, time.GetLength(0))
                     select new{
                         X = time[x,0],
                         Y = time[x,1]
                    }into point
                    orderby point.X descending
                    select point;

Как @Haxx указывает, просто добавьте , пункт. Y спускающийся к orderby пункт, если заказ второй стоимости также важен.

0
добавлено
обратите внимание что это won' t сортируют x, y combi этот путь. это произведет {{0, 4} {0, 2}, {1, 5}, {3, 4} {5, 10}}; когда вы сортируете возрастание. (отметьте первые 2 пары). Не уверенный, если that' s проблема.
добавлено автор bas, источник
Я вижу что you' достигающее ре. Да, it' s неясный, что было необходимо.
добавлено автор Kevin Stricker, источник
Кроме того, это произведет это наоборот.;)
добавлено автор Kevin Stricker, источник

Принятие:
1. Вы хотите сохранять пункты соединенными, например, хотеть рассматривать {0, 4} как одна пара, {1, 5} как другая пара.
2. Ожидаемый результат в порядке возрастания: {{0, 2}, {0, 4}, {1, 5}, {3, 4}, {5, 10}}.

Как предложено BTownTKD, сильно рекомендуйте использовать некоторый класс/структуру, чтобы представлять вашу пару вместо того, чтобы использовать многомерный массив. Можно использовать список/множество любого из следующего:

  • Tuple
  • KeyValuePair
  • your own struct IntPair, having two properties X and Y.

This will not only help you to sort, but also to do further manipulations easily. Use multidimensional array only if you have a very specific need to.

Вот пример кода, используя Кортеж:

List> time = new List>(){
    new Tuple(0,4),
    new Tuple(1,5),
    new Tuple(5,10),
    new Tuple(3,4),
    new Tuple(0,2)
};

//Sort Ascending
time.Sort((first, second) =>
    {
        var item1Compare = first.Item1.CompareTo(second.Item1);
        return item1Compare == 0 ? first.Item2.CompareTo(second.Item2) : item1Compare;
    });
//Sort Descending
/*time.Sort((first, second) =>
    {
        var item1Compare = second.Item1.CompareTo(first.Item1);
        return item1Compare == 0 ? second.Item2.CompareTo(first.Item2) : item1Compare;
    });*/
0
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot