C# 排序的多种实现方式

文章介绍了在C#编程中如何对数组和List进行排序,包括使用冒泡排序法、Array.Sort方法、List.Sort方法以及OrderBy和OrderByDescending等排序技巧。对于复杂情况,如列表中对象属性的排序,文章也给出了相应的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

01 数组排序

最常见的排序是对一个数组排序,比如:

int[] aArray = new int[8] { 18, 17, 21, 23, 11, 31, 27, 38 };

第一种:我们最熟悉的冒泡排序法:即每个值都和它后面的数值比较,每次拿出最小值

static void Main(string[] args)

{

int[] aArray = new int[8] { 18, 17, 21, 23, 11, 31, 27, 38 };

for (int j = 0; j < aArray.Length - 1; j++)

{

for (int i = 0; i < aArray.Length - 1; i++)

{

if (aArray[i] > aArray[i + 1])

{

int temp = aArray[i];

aArray[i] = aArray[i + 1];

aArray[i + 1] = temp;

}

}

}

foreach (var a in aArray)

{

Console.Write($"{a} ");

}

Console.ReadKey();

}

第二种:利用Array.Sort排序

① 升序排列:

static void Main(string[] args)

{

int[] aArray = new int[8] { 18, 17, 21, 23, 11, 31, 27, 38 };

Array.Sort(aArray);

foreach (var a in aArray)

{

Console.Write($"{a} ");

}

Console.ReadKey();

}

② 降序排列:先升序排列,然后对数组反转

static void Main(string[] args)

{

int[] aArray = new int[8] { 18, 17, 21, 23, 11, 31, 27, 38 };

Array.Sort(aArray);

Array.Reverse(aArray);

foreach (var a in aArray)

{

Console.Write($"{a} ");

}

Console.ReadKey();

}

02 List排序

大多数时候,我们需要将list集合里面的数据进行排序,

① 如果list直接放置的数值类型的数据就比较简单,比如:

List<int> aList = new List<int> { 18, 17, 21, 23, 11, 31, 27, 38 };

方法一:利用List<T> 自带的Sort排序方法

升序排列:

aList.Sort();

降序排列:

aList.Sort();

aList.Reverse();

-. sort也可以用如下方式操作:

list.Sort((a, b) => a.CompareTo(b));//升序

list.Sort((a, b) => b.CompareTo(a));//降序

方法二:利用List的OrderBy与OrderByDescending方法

升序排列:

List<int> aList = new List<int> { 18, 17, 21, 23, 11, 31, 27, 38 };

aList = aList.OrderBy(a => a).ToList();

降序排列:

List<int> aList = new List<int> { 18, 17, 21, 23, 11, 31, 27, 38 };

aList = aList.OrderByDescending(a => a).ToList();

方法三:利用link,这种感觉和方法二是一回事

List<int> aList = new List<int> { 18, 17, 21, 23, 11, 31, 27, 38 };

aList = (from a in aList orderby a ascending select a).ToList();//升序

aList = (from a in aList orderby a descending select a).ToList();//降序

②如果list存放的是一个类型,比如:

方法一: 一个集合存放学生的信息,按照学生的成绩升序排列:这里列举了2种方法,方法一注释了

static void Main(string[] args)

{

List<Student> stuList = new List<Student>

{

new Student() {name = "zyr", age = 23, score = 99},

new Student() {name = "zls", age = 25, score = 95},

new Student() {name = "zsq", age = 27, score = 100},

new Student() {name = "zlw", age = 15, score = 69},

new Student() {name = "ywe", age = 17, score = 72},

new Student() {name = "asw", age = 29, score = 58}

};

//方法1 升序

//stuList.Sort((x, y) => x.score.CompareTo(y.score));

//方法2 升序

stuList = stuList.OrderBy(stu=>stu.score).ToList();

foreach (var stu in stuList)

{

Console.WriteLine($"{stu}");

}

Console.ReadKey();

}

public class Student

{

public string name { get; set; }

public int age { get; set; }

public int score { get; set; }

public override string ToString()

{

return $"姓名是:{name},年龄是:{age},得分是:{score}";

}

}

方法二: 加入这个学生成绩有重复的,对于重复的成绩按照年龄再排序:这里列举了2种方法,方法一注释了

static void Main(string[] args)

{

List<Student> stuList = new List<Student>

{

new Student() {name = "zyr", age = 23, score = 99},

new Student() {name = "zls", age = 25, score = 95},

new Student() {name = "zls", age = 22, score = 95},

new Student() {name = "zsq", age = 27, score = 100},

new Student() {name = "zlw", age = 15, score = 69},

new Student() {name = "ywe", age = 17, score = 72},

new Student() {name = "asw", age = 29, score = 58},

new Student() {name = "ywe", age = 18, score = 72},

new Student() {name = "zsq", age = 16, score = 100},

};

//方法1 升序

//stuList.Sort((x, y) =>

//{

// int ret = x.score.CompareTo(y.score);

// if (ret == 0)

// {

// return x.age.CompareTo(y.age);

// }

// else

// {

// return ret;

// }

//});

//方法2 升序

//stuList = stuList.OrderBy(stu=>stu.score).ThenBy(stu => stu.age).ToList();

foreach (var stu in stuList)

{

Console.WriteLine($"{stu}");

}

Console.ReadKey();

}

public class Student

{

public string name { get; set; }

public int age { get; set; }

public int score { get; set; }

public override string ToString()

{

return $"姓名是:{name},年龄是:{age},得分是:{score}";

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值