C#数组Array.Sort()、List.Sort()排序使⽤⽅法
【对⼀维数组】
数据:int[] A = {16, 67, 12, 50, 8, 46, 4};
整体升序:Array.Sort(A);
整体降序:先升序,再反转Array.Reverse(A);
局部升序: Array.Sort(A,2,4);//从索引为2的元素开始的4个元素进⾏升序
局部降序:Array.Reverse(A,2,3);//对索引为2的元素开始的3个元素进⾏反转,这是接着Array.Sort执⾏的
从左到右的图⽚分别是从整体升序到局部降序的结果
【对交错数组】
有时我们希望根据交错数组(不是⼆维数组)中某⼀⾏中的某个元素来确定不同⾏之间的排序,这时就要⾃定义实现⽐较⽅法。对于int 类型或string类型的数组,C#内部已经帮你实现了⽐较⽅法,所以
只需要把数组(具体来说是数组的引⽤)作为参数传递给
Array.Sort()就好了。
代码
{
class Program
{
static void Main(string[] args)
{
//随机⽣成交错数组
int[][] nums=new int[10][];
Random ra=new Random();
for (int i = 0; i < 10; i++)
{
nums[i] = new int[2] {ra.Next(30), ra.Next(30)};//每⾏只有两个元素
}
Array.Sort(nums,new CompareMethod());//调⽤的⽅法是public static void Sort<T>(T[] array, IComparer<T> comparer);
// Array.Sort(nums,2,6,new CompareMethod());//对从索引为2开始的6个元素排序
for (int i = 0; i < 10; i++)
{
Console.WriteLine(nums[i][0]+" "+nums[i][1]);
}
Console.ReadLine();
}
public class CompareMethod : IComparer<int[]> //继承IComparer<T>接⼝,T为要⽐较的元素的类型
{ //类中类,也可以放在类外⾯
public int Compare(int[] x, int[] y)
{
return x[0] - y[0];//返回值⼤于0表⽰x>y,等于0表⽰x=y,⼩于0表⽰x<y。Array.Sort内部会根据这个返回值来判断x和y的⼤⼩关系,并把⼩的元素放在前⾯ //如果想降序怎么办,返回y[0]-x[0]即可
}
}
}
}
输出结果
【结构体数组】
每次继承接⼝写起来会⽐较⿇烦,更简单的⽅法是⽤委托,也即调⽤public static void Sort<T>(T[] array, Comparison<T>
comparison);⽅法,Comparison<T>是⼀个泛型委托public delegate int Comparison<in T>(T x, T y);
对学⽣的成绩进⾏排序,希望成绩⾼的排在前⾯,对成绩相同的学号⼩的排在前⾯
代码
{
class Program
{
static void Main(string[] args)
{
Student[] nums = new Student[5];
nums[0]=new Student(1001,90,"张");
nums[1]=new Student(1009,83,"王");
nums[2]=new Student(1004,88,"李");
nums[3]=new Student(1002,88,"何");
nums[4]=new Student(1005,93,"赵");
Array.Sort(nums,CompareMethod);
for (int i = 0; i < nums.Length; i++)
{
Console.WriteLine("第"+(i+1)+"名"+nums[i].name+" 学号:"+nums[i].id+" 分数:"+nums[i].score);
}
Console.ReadKey();
}
public struct Student
{
public int id;
public int score;
public string name;
public Student(int id, int score, string name)
{
this.id = id;
this.score = score;
this.name = name;
}
}
public static int CompareMethod(Student a, Student b)
{
int temp = b.score - a.score;
if (temp == 0)
{
temp = a.id - b.id;
}
return temp;
}
}
}
输出结果
【使⽤Lambda表达式】
lambda表达式可以基于很简单的⽅法⽣成委托,且避免了需要声明新⽅法(及CompareMethod)的⿇烦,使得代码更简单。当然,另⼀⽅⾯不熟悉的话也更不好理解。
只需要对调⽤的Array.Sort简单改⼀下即可
Array.Sort(nums, (a, b) =>
{
int temp = b.score - a.score;
if (temp == 0)
temp = a.id - b.id;
return temp;
});
//注解:
//a b就是参数的名字,相当之前的Student a,Student b,只不过把Student省略了,默认了是Student类型的,所以参数名字任意,写成aaa,bbb都可以 //参数要⽤括号括起来,就跟⼀般⽅法的参数要⽤括号⼀样
//之后跟着“=>”号
//接下来是花括号,就跟⼀般⽅法要加花括号⼀样
//在花括号内部的代码和之前的CompareMethod⽅法完全⼀样
//关于返回值和参数,要看这个委托定义的是什么样⼦的sort命令排序
【List.Sort()排序】
List.Sort⽅法内部调⽤了Array.Sort,排序实现完全和Array.Sort⼀样
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论