感觉C#比C++麻烦许多,资料也少,找了半天竟然没有找到一个能用的结构体排序。
这是待排序的结构体:
public struct la
{
public int id;
public int sb;
};
首先,C#需要调用一个空间(类似头文件)
using System.Collections;
其次 c#的compare函数需要一个类(类里面才是传统c++的compare函数)
public class cmp : IComparer //注意一定要是“public”,一定要是“class”,一定要是“IComparer”,“cmp”为自己随便起的名。
{
public int Compare(object x, object y) //这里很坑,一定注意必须为int,“Compare”看似是命名一个函数,但只能用这一个名字,object也不能改!!
{
la a = (la)(x);
la b = (la)(y);//然后直接强转(很蠢)
if (a.id < b.id) return -1;//小于0为x小于y
else if (a.id > b.id) return 1;//大于0为x大于y
else return 0;//等于0为x等于y
}
}
最后,排序函数也要注意,compare函数是需要声明的!
IComparer Cmp = new cmp();//不要忘记这一句
Array.Sort(a,0,2,Cmp);
对于熟悉C++,学C#的人来说,C#的有些代码比较繁琐。(比如恶心的byte+byte=int,声明变量必须用new ,明明不需要这么麻烦的)
如结构体排序,<algorithm>封装的sort对compare函数就很便捷,而C#调用的IComparer 就较为复杂
而且C#语法过于死板,但似乎功能更多。
附上完整能运行的代码:
using System;
using System.Collections;
namespace ConsoleApp1
{
class Program
{
public struct la
{
public int id;
public int sb;
};
public class cmp : IComparer //注意一定要是“public”,一定要是“class”,一定要是“IComparer”,“cmp”为自己随便起的名。
{
public int Compare(object x, object y) //这里很坑,一定注意必须为int,“Compare”看似是命名一个函数,但只能用这一个名字,object也不能改!!
{
la a = (la)(x);
la b = (la)(y);//然后直接强转(很蠢)
if (a.id < b.id) return -1;//小于0为x小于y
else if (a.id > b.id) return 1;//大于0为x大于y
else return 0;//等于0为x等于y
}
}
static void Main(string[] args)
{
la[] a = new la[9];
a[0].id = 2;a[0].sb = 1;
a[1].id = 1;a[1].sb = 2;
IComparer Cmp = new cmp();//不要忘记这一句
Array.Sort(a,0,2,Cmp);
for (int i = 0; i <= 1; i++)
Console.WriteLine(a[i].sb);
}
}
}
关于 结构体排序 有什么疑问可以评论问。。(虽然我也很菜)