使用 2 个其他数组对数组进行排序
Posted
技术标签:
【中文标题】使用 2 个其他数组对数组进行排序【英文标题】:Sort an array using 2 other arrays 【发布时间】: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 等效脚本运行时版本。 我试试看,谢谢 【参考方案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# 版本,我无法访问元组:/ 虽然***.com/questions/7120845/…很容易创建一个 当然,您只需将.OrderBy(...)
更改为 .OrderBy(t => t.Item1).ThenBy(t => 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
【讨论】:
以上是关于使用 2 个其他数组对数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Iphone SDK 中基于单个数组对多个数组进行排序