【问题标题】:Reforming integer range to a smaller integer range (Unity (C#))将整数范围重整为更小的整数范围 (Unity (C#))
【发布时间】:2020-03-30 23:39:32
【问题描述】:

所以,我在一个列表中有一组整数

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

我想要做的是更改这些数字,使它们在 0 到 6 之间排序,设置为兄弟索引。

然后会变成

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

但我真的不知道该怎么做……有人知道吗?

附:我无法重新排列数字,因为这样我就会忘记游戏对象,因为数字本身实际上并不在数组中,但是我在数组中有游戏对象,并且我找到了每个游戏对象的“SortIndex”,它们是数字从上面看,数组中数字的顺序实际上就是数组中GameObjects的顺序,我需要保持不变。

编辑:我也不能将它们更改为浮点值,因为由于某种原因,当使用 SetSiblingIndex(int) 时,你必须使用整数,你不能使用浮点数

编辑 2:我不是在尝试对数字进行排序,而是在尝试将数字从 3-11 转换为 ORDER 中的 0-6

发件人:

{3, 7, 6, 9, 8, 10, 11}

收件人:

{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) 个索引时,它运行良好,但是当我添加更多时,它开始给我错误的数字

这就是它所提供的

【问题讨论】:

  • 那么您需要从numbersnewArrangedNumbers 的简单转换吗?我假设数字0-6是由numbers的递增顺序决定的?
  • 是的,我正在尝试将 3-11 的数字更改为 0-6,但我需要它们保持相同的顺序
  • 根据我从您的帖子中收集到的信息,您似乎正在处理索引。您并没有缩小数字,而是这些数字是在输入列表中排序的索引。
  • 好吧,我很抱歉,我没有完全理解你们编写的代码,所以很混乱,我最初的目标不是获取索引,但我确实知道你是如何到达那里的,并且是的,这对我有用,我现在唯一的问题是统一没有我可以找到的 OrderBy 分类器。
  • 好的,所以我遇到了一个新问题,它有效,但是当我尝试将第 7 项添加到列表中时,它又搞砸了......它把它们放在了错误的顺序..有没有办法解决这个问题?

标签: c# unity3d


【解决方案1】:

这是一个从这个堆栈表单C# Sort list while also returning the original index positions?实现所需输出的好方法

您的解决方案的修改代码如下。

//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();

编辑

由于您对列表进行排序,而且还根据您刚刚排序的列表检索排序索引,因此您不会与游戏对象发生任何混淆。

【讨论】:

  • 我收到了回复,但我试图从数字列表中获取到排列的数字列表,分别将数字 3-11 转换为 0-6
  • 您不是对列表进行排序,而是显示该排序列表的索引?
  • 我不是在尝试对列表进行排序,而是在尝试将索引从 3 - 11 的范围(从第一个列表)转换为一个新列表(具有相同的索引),即而是仅从 0-6,例如,3 将变为 0,6 将变为 1,7 将变为 2,等等...
  • @AaronJones,初始定义应该是 { 3, 7, 6, 9, 8, 10, 11 },而不是索引位置。{ 0, 2, 1, 4, 3, 5, 6 } 是 newArrangedNumbers 的期望输出
  • 谢谢Dragonel,你的权利!我对我的帖子进行了更改。
【解决方案2】:

听起来您想在相同项目的排序列表中查找每个元素的位置。

所以排序并找到元素在哪里并分配索引。下面的代码示例假定唯一编号:

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;
}

注意事项

  • 如果您想坚持使用此代码,我会使用字典而不是 IndexOf 来处理大约 5-10 个项目。
  • 如果数字不是唯一的或性能很重要,您需要使用 Aaron Jones 的解决方案,该解决方案最终将跟踪原始索引,即使它更难理解。

【讨论】:

  • 我编辑了我的帖子以尝试清除它,我不是想对数字进行排序,我想从数字 3-11 转换为 0-6,同时保持每个数字同一个地方
  • 好的,我可能误读了您的目标,但无论哪种方式,我都无法使用这些解决方案,因为 unity 在列表中没有函数“.OrderBy”,这意味着我无法获得结果甚至编译我的代码,我是否缺少使用参考?
  • 你需要是using System.Linq
  • 好的,很抱歉让大家感到困惑,我不明白你在做什么,我以为你只是想按值对数组进行排序,我还在学习 c#,所以我很抱歉,感谢你们,我得到了它,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多