Сортировка многомерного массива [,] в C #, состоящего из целых чисел - PullRequest
3 голосов
/ 02 февраля 2010

У меня есть следующий массив:

private int[,] testSamples = new testSamples[101,101];

Предполагается, что он представляет собой список с колонками от 0 до 100 и строками от 0 до 100. В этих списках отбрасываются различные химические жидкости. Человек, для которого я делаю это, хочет работать так, чтобы он мог сначала позаботиться о контейнере, в котором больше всего жидкости.

Итак, мне нужно вывести данные и распечатать их следующим образом:

testSamples[35,40] = 12
testSamples[11,12] = 11
testSamples[92,14] = 10
testSamples[18,3] = 10
testSamples[1,61] = 7
...

Например. Я ломал голову над этим в течение нескольких дней, я смотрел некоторые другие вопросы здесь, на StackoverFlow, но я не могу заставить их работать.

Есть ли способ сделать это, или я должен отказаться от массивов и перейти к другому виду контейнеров, таких как ArrayLists или List элементов?

Ответы [ 4 ]

5 голосов
/ 02 февраля 2010

Вы можете сделать это, но вам нужен контейнер для хранения выходных пар индексов, быстрый способ сделать это - анонимный тип и LINQ:

var sorted = from x in Enumerable.Range(0, testSamples.GetLength(0))
             from y in Enumerable.Range(0, testSamples.GetLength(1))
             select new {
                X = x,
                Y = y,
                Value = testSamples[x,y]
             } into point
             orderby point.Value descending
             select point;

После этого sorted - это IEnumerable анонимного типа, каждый из которых является индексом и значением из массива.

РЕДАКТИРОВАТЬ: Поставьте наибольший первый ...

2 голосов
/ 02 февраля 2010

Вам, вероятно, лучше использовать что-то вроде OrderedBag . Кроме того, вы можете захотеть, чтобы ваш список хранили что-то другое, чем просто целые числа. Похоже, существует более сложный логический объект, который вы пытаетесь изобразить, например, реестр, эксперимент, мензурка или что-то в этом роде.

Обновление: отредактировано на основе комментариев относительно SortedList для использования вместо него OrderedBag.

1 голос
/ 02 февраля 2010

Вот предположение, которое, я думаю, в конечном итоге будет похоже на Ричарда, но без использования LINQ.

Напишите быструю структуру (что-то подобное может уже существовать), которая включает три значения: x, y и value. Как это:

public struct SampleSlot : IComparable<SampleSlot> {
    public int X;
    public int Y;
    public int Value;

    public SampleSlot(int x, int y, int value) {
        X = x;
        Y = y;
        Value = value;
    }

    public int CompareTo(SampleSlot other) {
        return Value.CompareTo(other.Value);
    }
}

Затем вы можете свернуть массив int[,] в любую сортируемую одномерную коллекцию SampleSlot объектов, которые вам нравятся; Я бы, наверное, пошел с List<SampleSlot>:

List<SampleSlot> slotsList = new List<SampleSlot>();

for (int i = 0; i < testSamples.GetLength(0); ++i) {
    for (int j = 0; j < testSamples.GetLength(1); ++j) {
        slotsList.Add(new SampleSlot(i, j, testSamples[i, j]));
    }
}

slotsList.Sort();

// assuming you want your output in descending order
for (int i = slotsList.Count - 1; i >= 0; --i) {
    SampleSlot slot = slotsList[i];
    Console.WriteLine("testSamples[{0},{1}] = {2}", slot.X, slot.Y, slot.Value);
}
0 голосов
/ 02 февраля 2010

Предположим, 3х3:

5 4 3
2 1 9
8 7 6

Вы можете просто сохранить координаты в SortedDictionary с размером ключевой жидкости, значение координаты:

key - value
9 - [2,1]
8 - [0,3]
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...