You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对含双数组的单个类实例按指定数组排序?

解决单个实例中双数组按指定数组排序的问题

嘿,我完全懂你的困惑!本来以为排序相关的方案网上一搜全有,结果碰到这种单个类实例里两个关联数组的排序问题,确实有点挠头——毕竟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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:07:23