如何对含双数组的单个类实例按指定数组排序?
解决单个实例中双数组按指定数组排序的问题
嘿,我完全懂你的困惑!本来以为排序相关的方案网上一搜全有,结果碰到这种单个类实例里两个关联数组的排序问题,确实有点挠头——毕竟IComparable天生是用来给多个类实例排序的,和咱们现在的场景不搭。不过别慌,咱们换个思路就能搞定!
首先先还原下你的类结构(我假设两个数组长度一致哈):
public class MyCombinedData { public int[] Data { get; set; } // 要按这个数组降序排序 public string[] CorrespondingLabels { get; set; } // 和Data一一对应的关联数组 }
核心思路其实很简单:把两个数组的对应元素先配对,按Data的值排序后,再拆分回原来的两个数组。下面给你两种常用的实现方式:
方式一:用匿名对象配对(可读性强)
在你的类里加一个排序方法就行:
public void SortByDataDescending() { // 第一步:把Data和对应的Labels配对成匿名对象集合 var pairedItems = Data.Zip(CorrespondingLabels, (dataVal, labelVal) => new { DataValue = dataVal, LabelValue = labelVal }) // 第二步:按DataValue降序排序 .OrderByDescending(item => item.DataValue) .ToList(); // 第三步:把排序后的结果拆分回原数组 Data = pairedItems.Select(item => item.DataValue).ToArray(); CorrespondingLabels = pairedItems.Select(item => item.LabelValue).ToArray(); }
方式二:用ValueTuple配对(代码更简洁)
如果你的项目用的是C# 7.0及以上版本,用值元组会更清爽:
public void SortByDataDescending() { var pairedItems = Data.Zip(CorrespondingLabels, (d, l) => (DataVal: d, LabelVal: l)) .OrderByDescending(tuple => tuple.DataVal) .ToList(); Data = pairedItems.Select(t => t.DataVal).ToArray(); CorrespondingLabels = pairedItems.Select(t => t.LabelVal).ToArray(); }
一些要注意的点
- 一定要保证
Data和CorrespondingLabels的长度始终一致,不然Zip方法只会处理到较短数组的长度,剩下的元素会被忽略; - 如果你的数组是只读的(比如用
readonly修饰),那不要直接修改原数组,而是返回一个新的MyCombinedData实例,把排序后的数组赋值给新实例的属性就行。
内容的提问来源于stack exchange,提问作者JohnC.IT
相关产品推荐
相关产品推荐

