C#学习之自定义数组及其排序
2014-09-21 17:02
393 查看
在C#中对数组的定义比较灵活。这里着重说一下自定义数组和Array类的排序。 在Array类中通过属性Length就可以获取整个数组中数据的数量,可以通过foreach迭代数组。 使用Rank属性可以获取数组的维数,通过属性LongLength也可获取数组中数据的数量,但是基本上不用。 它是当数组中放置的数据量超出了整数的范围时才用。 |
Array类中排序的方法比较简单,对于string 和 Int 类型直接用Array.Sort()就可以。 但是对于自定义的数组就需要在类中写出Array.Sort()中使用的排序方法。 如下: namespace ArrayStudy { //类需要实现IComparable<>接口 public class Person:IComparable<Person> { public string FirstName { get; set; } public string LastName { get; set; } public override string ToString() { return string.Format("{0} {1}",FirstName,LastName); } //CompareTo是IComparable接口里面的函数 //如果相比较的两个相等,结果是0 //Array.sort()会根据返回的值进行排序 public int CompareTo(Person other) { if(other==null) { throw new ArgumentNullException("other"); } int result = this.FirstName.CompareTo(other.FirstName); if(result==0) { result = this.LastName.CompareTo(other.LastName); } return result; } } } 上面的类中,是对FirstName 排序的,如果FirstName相同,就比较LastName. 主函数调用方式如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ArrayStudy { class Program { static void Main(string[] args) { Person[] person ={ new Person{FirstName="Chen",LastName="Long"}, new Person{FirstName="Wang",LastName="Xinyu"}, new Person{FirstName="Jia",LastName="Yankun"}, new Person{FirstName="Jiao",LastName="Yuanyuan"}, new Person{FirstName="Zhang",LastName="Huangjian"} }; Array.Sort(person); foreach(Person p in person) { Console.WriteLine(p.ToString()); } Console.WriteLine("Rank:{0}",person.Rank); Console.WriteLine("LongLength:{0}",person.LongLength); Console.WriteLine("Length:{0}",person.Length); Console.ReadKey(); return; } } } |
而对于不能确定要对哪一个变量进行排序的时候就需要增加一个新的比较类。这个类是实现了IComparer<>接口. 在这个接口里面含有int Compare(T x,T y)比较函数,里面含有两个变量。 namespace ArrayStudy { //首先定义枚举的类型,在下面的switch中进行判断 public enum PersonCompareType { FirstName, LastName } public class PersonComparer:IComparer<Person> { private PersonCompareType comparetype; public PersonComparer(PersonCompareType comparetype) { this.comparetype = comparetype; } public int Compare(Person x,Person y) { if (x == null) throw new ArgumentNullException("x"); if (y == null) throw new ArgumentNullException("y"); int result = x.FirstName.CompareTo(y.FirstName); int result2= x.LastName.CompareTo(y.LastName); switch(comparetype) { //如果对目标类型排序发现相同,就对另外一个排序并返回值 case PersonCompareType.FirstName: { if (result == 0) return result2; return result; } case PersonCompareType.LastName: { if (result2 == 0) return result; return result2; } default : throw new ArgumentException( "unexpected compare type" ); } } } } 将主函数中的排序改成如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ArrayStudy { class Program { static void Main(string[] args) { Person[] person ={ new Person{FirstName="Chen",LastName="Long"}, new Person{FirstName="Wang",LastName="Xinyu"}, new Person{FirstName="Jia",LastName="Yankun"}, new Person{FirstName="Jiao",LastName="Yuanyuan"}, new Person{FirstName="Zhang",LastName="Huangjian"} }; //在Sort()后面添加第二个参数,这个参数是比较的方法类型 Array.Sort(person,new PersonComparer(PersonCompareType.FirstName)); foreach(Person p in person) { Console.WriteLine(p.ToString()); } Console.WriteLine("Rank:{0}",person.Rank); Console.WriteLine("LongLength:{0}",person.LongLength); Console.WriteLine("Length:{0}",person.Length); Console.ReadKey(); return; } } } 这样便可以灵活选择排序的对象了。 |
相关文章推荐
- C#自定义对象排序(数组/ArrayList)
- C#学习笔记- 浅谈数组复制,排序,取段,元组
- C#项目的.settings文件中的自定义类型(及其数组)的配置步骤
- c#例题:输入学生的学号,姓名,分数,然后根据分数进行排序再输出最终结果。重点学习用结构体定义数组的表达方式
- C#学习笔记(28)——委托排序(2)自定义排序
- C#委托的简单学习:定义委托和使用、Func<int f1,out r1>、给自定义的类或数组排序(冒泡排序)
- C#教程第2讲数组(学习笔记)
- C# 学习自定义控件,从一个简单实用的日期控件开始。
- 数组的排序学习!!
- C#对象数组排序方法
- C#的对数组排序
- c#学习体会:使用 ref 和 out 传递数组(downmoon)
- C#基础学习日志===&gt;数组&lt;===
- C# 2.0学习之--数组
- C# 数组学习
- c#学习体会:使用 ref 和 out 传递数组
- C# 学习自定义控件,从一个简单实用的日期控件开始。
- 一步一步学习ObjectDataSource控件--自定义分页排序
- C# 2.0学习之--数组
- C#对象数组排序方法