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

C#实现按x1降序、x1相等时x2升序的对象列表排序需求

按指定规则排序A类对象列表

需求:对包含x1、x2两个浮点属性的A类对象列表进行排序,规则如下:

  • 优先以x1为依据降序排列
  • 当多个对象的x1值相等时,以x2为依据升序排列

原A类定义及示例列表

public class A
{
    public float x1;
    public float x2;

    public A(float x1, float x2)
    {
        this.x1 = x1;
        this.x2 = x2;
    }
}

// 示例列表初始化
List<A> sortedA = new List<A>();
sortedA.Add(new A(5, 1));
sortedA.Add(new A(7, 2));
sortedA.Add(new A(4, 3));
sortedA.Add(new A(2, 4));

示例1(无x1重复值)

排序前:

x1 - x2
5 - 1
7 - 2
4 - 3
2 - 4

排序后预期结果:

7 - 2
5 - 1
4 - 3
2 - 4

示例2(存在x1重复值)

排序前:

x1 - x2
5 - 2
3 - 1
7 - 5
7 - 2

排序后预期结果(x1相等时取x2最小的):

7 - 2
7 - 5
5 - 2
3 - 1

实现方法

方法1:使用List.Sort()结合Comparison委托

直接通过委托定义排序逻辑,适合快速实现:

sortedA.Sort((a, b) => {
    // 先比较x1,降序
    int x1Compare = b.x1.CompareTo(a.x1);
    if (x1Compare != 0)
    {
        return x1Compare;
    }
    // x1相等时比较x2,升序
    return a.x2.CompareTo(b.x2);
});

方法2:使用LINQ的OrderByDescending和ThenBy

通过LINQ链式调用实现,返回新的排序后的列表,不修改原列表:

var sortedList = sortedA.OrderByDescending(a => a.x1)
                        .ThenBy(a => a.x2)
                        .ToList();

方法3:让A类实现IComparable<A>接口

如果A类经常需要按此规则排序,推荐实现接口,使排序逻辑内聚:

public class A : IComparable<A>
{
    public float x1;
    public float x2;

    public A(float x1, float x2)
    {
        this.x1 = x1;
        this.x2 = x2;
    }

    public int CompareTo(A other)
    {
        if (other == null) return 1;
        
        // 先比较x1降序
        int x1Compare = other.x1.CompareTo(this.x1);
        if (x1Compare != 0)
        {
            return x1Compare;
        }
        // x1相等时比较x2升序
        return this.x2.CompareTo(other.x2);
    }
}

// 使用时直接调用Sort()
sortedA.Sort();

内容的提问来源于stack exchange,提问作者galabataun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:31:04