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
相关产品推荐
相关产品推荐

