【问题标题】:Sort an array using 2 other arrays使用 2 个其他数组对数组进行排序
【发布时间】:2018-05-05 20:02:12
【问题描述】:

这是一个奇怪的特殊情况,但我有 3 个数组,所有数组都具有灵活的大小(但相同)和贵重物品,我需要使用另外 2 个来订购其中一个。 比如

int[] array1 = new int[0 ,1 ,1 ,1 ,0];
int[] array2 = new int[5 ,3 ,4 ,2 ,0];
int[] array3 = new int[0 ,1 ,2 ,3 ,4];

// Results array3 == [2,1,3,0,4]

我想首先按第一个数组的值对第三个数组进行排序,并在第一个数组无法排序的情况下使用第二个数组。 有没有办法干净地做到这一点,还是我必须硬编码?

【问题讨论】:

  • 如果可能的话,我建议您创建一个包含三个相关值的类并使用一个数组。像这样在单独的数组中包含相关值是一种常见的反模式。
  • 创建一个包含 3 个 int 值的元组。然后使用自定义比较器
  • unity使用的c#版本不支持元组。
  • @Joska Unity 支持 C#6 的元组,您需要切换到 .NET 4.x 等效脚本运行时版本。
  • 我试试看,谢谢

标签: c# arrays unity3d


【解决方案1】:

正如那些在 cmets 中所说的那样,在元组或类中这样做会更好

        var array1 = new int[] { 0, 1, 1, 1, 0};
        var array2 = new int[] { 5, 3, 4, 2, 0};
        var array3 = new int[] { 0, 1, 2, 3, 4};

        var listOfTuples = array1.Select((t, i) => new Tuple<int, int, int>(t, array2[i], array3[i])).ToList();
        listOfTuples = listOfTuples.OrderBy(t => new {t.Item1, t.Item2}).ToList();

这些将由 array1 然后 array2 排序。

如果您想要一个没有元组的解决方案,请在 cmets 中添加。

【讨论】:

  • 由于 unity 使用的是非常旧的 c# 版本,我无法访问元组:/
  • 虽然stackoverflow.com/questions/7120845/…很容易创建一个
  • 当然,您只需将 .OrderBy(...) 更改为 .OrderBy(t =&gt; t.Item1).ThenBy(t =&gt; t.Item2) 即可,无需创建额外的 IComparer。
  • @Trevor 我有点不知道 ThenBy。我编辑了我的答案。基本上现在它真的是单行的,即使没有原生 c# 元组。
【解决方案2】:

要让它与较旧的 .NET 版本(如 3.5)一起使用,请使用 Select() 将数组转换为匿名对象列表(基本上类似于元组)。然后使用OrderBy()ThenBy() 根据第一个数组和第二个数组中的值对列表进行排序:

var array1 = new int[] { 0, 1, 1, 1, 0};
var array2 = new int[] { 5, 3, 4, 2, 0};
var array3 = new int[] { 0, 1, 2, 3, 4};

var list = array1.Select((t, i) => new { X1 = t, X2 = array2[i], X3 = array3[i] })
                 .OrderBy(t => t.X1) // first order by values from array1
                 .ThenBy(t => t.X2)  // then by values from array2
                 .Select(t => t.X3)  // we only want values from array3
                 .Reverse();         // put into right order

输出:

2 1 3 0 4

【讨论】:

    猜你喜欢
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    相关资源
    最近更新 更多