C#知识:List排序
默认排序往往不够用,学会自定义排序很重要。
1、默认排序
- 只有少数类型能用,例如值类型int、float,double等
- 默认升序
csharp
//系统自带排序
List<int> list = new();
list.Add(5);
list.Add(8);
list.Add(1);
list.Add(6);
list.Add(2);
Print<int>(list); //5 8 1 6 2
//系统默认排序方法,默认升序
list.Sort();
Print<int>(list); //1 2 5 6 8
2、实现IComparable接口
- 重写CompareTo方法,实现排序逻辑
csharp
class Equipment:IComparable<Equipment>
{
public string equipmentName;
public int damage;
public float price;
public Equipment(string equipmentName, int damage, float price)
{
this.equipmentName = equipmentName;
this.damage = damage;
this.price = price;
}
public int CompareTo(Equipment? other)
{
if(this.price > other.price)
return -1;
else if(this.price < other.price)
return 1;
return 0;
}
public override string ToString()
{
return $" 【名称:{equipmentName}, 伤害:{damage}, 价格:{price}】";
}
}
csharp
List<Equipment> equipments = new List<Equipment>();
equipments.Add(new Equipment("猎犬长牙", 58, 100));
equipments.Add(new Equipment("碎星大剑", 120, 500));
equipments.Add(new Equipment("陨石杖", 60, 300));
equipments.Add(new Equipment("黄铜盾", 0, 200));
//以实现接口方式:价格降序排序
equipments.Sort(); //不实现接口直接排序会报错Unhandled exception. System.InvalidOperationException: Failed to compare two elements in the array.
Print<Equipment>(equipments);//【名称:碎星大剑, 伤害:120, 价格:500】 【名称:陨石杖, 伤害:60, 价格:300】 【名称:黄铜盾, 伤害:0, 价格:200】 【名称:猎犬长牙, 伤害:58, 价格:100】
3、传递委托函数
- 直接Sort方法传入委托函数参数
csharp
//Sort传入委托函数
//伤害升序
equipments.Sort((a, b) =>
{
if (a.damage > b.damage)
return 1;
else if (a.damage < b.damage)
return -1;
return 0;
});
Print<Equipment>(equipments);//【名称:黄铜盾, 伤害:0, 价格:200】 【名称:猎犬长牙, 伤害:58, 价格:100】 【名称:陨石杖, 伤害:60, 价格:300】 【名称:碎星大剑, 伤害:120, 价格:500】
4、完整代码示例
csharp
namespace LearnListSort
{
class Equipment:IComparable<Equipment>
{
public string equipmentName;
public int damage;
public float price;
public Equipment(string equipmentName, int damage, float price)
{
this.equipmentName = equipmentName;
this.damage = damage;
this.price = price;
}
public int CompareTo(Equipment? other)
{
if(this.price > other.price)
return -1;
else if(this.price < other.price)
return 1;
return 0;
}
public override string ToString()
{
return $" 【名称:{equipmentName}, 伤害:{damage}, 价格:{price}】";
}
}
internal class Program
{
static void Print<T>(List<T> list)
{
foreach (T item in list)
{
Console.Write(item.ToString() + " ");
}
Console.WriteLine();
}
static void Main(string[] args)
{
//系统自带排序
List<int> list = new();
list.Add(5);
list.Add(8);
list.Add(1);
list.Add(6);
list.Add(2);
Print<int>(list); //5 8 1 6 2
//系统默认排序方法,默认升序
list.Sort();
Print<int>(list); //1 2 5 6 8
List<Equipment> equipments = new List<Equipment>();
equipments.Add(new Equipment("猎犬长牙", 58, 100));
equipments.Add(new Equipment("碎星大剑", 120, 500));
equipments.Add(new Equipment("陨石杖", 60, 300));
equipments.Add(new Equipment("黄铜盾", 0, 200));
//以实现接口方式:价格降序排序
equipments.Sort(); //不实现接口直接排序会报错Unhandled exception. System.InvalidOperationException: Failed to compare two elements in the array.
Print<Equipment>(equipments);//【名称:碎星大剑, 伤害:120, 价格:500】 【名称:陨石杖, 伤害:60, 价格:300】 【名称:黄铜盾, 伤害:0, 价格:200】 【名称:猎犬长牙, 伤害:58, 价格:100】
//Sort传入委托函数
//伤害升序
equipments.Sort((a, b) =>
{
if (a.damage > b.damage)
return 1;
else if (a.damage < b.damage)
return -1;
return 0;
});
Print<Equipment>(equipments);//【名称:黄铜盾, 伤害:0, 价格:200】 【名称:猎犬长牙, 伤害:58, 价格:100】 【名称:陨石杖, 伤害:60, 价格:300】 【名称:碎星大剑, 伤害:120, 价格:500】
}
}
}
5、参考资料
- 《唐老狮C#》
本文结束,感谢您的阅读~
