Преобразование целочисленного диапазона в меньший целочисленный диапазон (Unity (C#)) - PullRequest
1 голос
/ 31 марта 2020

Итак, у меня есть набор целых чисел в списке

public List<int> numbers = new List<int>() { 3, 7, 6, 9, 8, 10, 11 }

, что я хочу сделать, это изменить эти числа так, чтобы они были упорядочены в диапазоне от 0 до 6, чтобы установить как siblingindexs.

, а затем изменится на

public List<int> newArrangedNumbers = new List<int>() {0, 2, 1, 4, 3, 5, 6}

Но я действительно не уверен, как это сделать ... Кто-нибудь знает?

PS Я не могу изменить номера, потому что тогда я бы потерять отслеживание игровых объектов, так как сами числа на самом деле не находятся в массиве, но у меня есть игровые объекты в массиве, и я нахожу «SortIndex» каждого игрового объекта, которые представляют собой числа сверху, порядок чисел в массив - это на самом деле порядок GameObjects в массиве, который мне нужно сохранить неизменным.

Редактировать: я также не могу изменить их на значения с плавающей точкой, потому что по какой-то причине при использовании SetSiblingIndex (int) у вас есть в целые числа вы не можете использовать числа с плавающей точкой

Редактировать 2: я НЕ пытаюсь отсортировать числа, я пытаюсь преобразовать числа от 3-11 до 0-6 в порядке

От:

{3, 7, 6, 9, 8, 10, 11}
* 1 019 * To:
{0, 2, 1, 4, 3, 5, 6}

Редактировать 3: Вот мой скрипт для тестирования

List<int> Indexs = new List<int>() { 4, 7, 56, 9, 65, 67, 8, 3, 6 };

        var sorted = Indexs.Select((x, i) => new KeyValuePair<int, int>(x, i)).OrderBy(x => x.Key).ToList();
        List<int> newArrangedNumbers = sorted.Select(x => x.Value).ToList();

        for(int i = 0; i < newArrangedNumbers.Count; i++)
        {
            Debug.Log(Indexs[i] + " : " + newArrangedNumbers[i]);
        }

Когда у меня было только 7 (0-6) индексов в списке «Индексы», это работало хорошо, но когда я добавил еще, он начал давать мне неправильные номера

Это то, что он дает с этим

enter image description here

Ответы [ 2 ]

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

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

Так что сортируйте и найдите, где находится элемент, и назначьте индекс. В приведенном ниже примере кода используются уникальные числа:

var sorted = numbers.OrderBy(x=>x).ToArray();
var result = new int[numbers.Count];
for (var i = 0; i < numbers.Count; i++)
{
    var index = number.IndexOf(sorted[i]);
    result[index] = i;
}

Примечания

  • для всего примерно 5-10 элементов. Я бы использовал словарь вместо IndexOf, если вы хотите придерживаться этого код.
  • если числа не уникальны или производительность критична, вам нужно использовать решение Аарона Джонса, которое в конечном итоге будет отслеживать исходные индексы, даже если его сложнее понять.
1 голос
/ 31 марта 2020

Вот хороший метод для достижения желаемого результата из этой формы стека. C# Сортировка списка при возврате исходных позиций индекса?

Ниже приведен модифицированный код для вашего решения. .

//The original list
List<int> numbers = new List<int>() { 3, 7, 6, 9, 8, 10, 11 };

var sorted = numbers
    .Select((x, i) => new KeyValuePair<int, int>(x, i))
    .OrderBy(x => x.Key)
    .ToList();

//The sorted list
List<int> numbersSorted = sorted.Select(x => x.Key).ToList();

//List of indexes sorted based on the list above
List<int> newArrangedNumbers = sorted.Select(x => x.Value).ToList();

Редактировать

Поскольку вы сортируете список, но также получаете отсортированные индексы на основе только что отсортированного списка, вы не будете иметь любое смешение с вашими игровыми объектами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...