用IComparable和IComparer来设置排序规则
只来干的,不来稀的。
/* * 由SharpDevelop创建。 * 用户: Owner * 日期: 2012-12-24 * 时间: 14:05 * * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;using System.Collections;/* * 假如我们开了一个水果超市:卖好多种类的水果,所以要统计我们的水果信息。 * 营业员要准确的掌握水果的信息就要进行排序,否则容易乱,一乱就容易出错。 * 通过水果超市的例子演示IComparable和IComparer的用法 * */namespace TestIComparable{#if false#region 可排序的水果管理/// <summary>/// 我们超市有好多水果,要管理的话按照名字排序可以更好的管理。/// </summary>public class 水果 : IComparable{public string 名称;public decimal 单价;public decimal 营业额;public 水果(string 名称, decimal 单价, decimal 营业额){this.名称 = 名称;this.单价 = 单价;this.营业额 = 营业额;}#region IComparablepublic int CompareTo(object obj){水果 品种 = obj as 水果;return this.名称.CompareTo(品种.名称);}#endregion}public class 超市{public ArrayList 水果架 = new ArrayList();/// <summary>/// 超市进货/// </summary>/// <param name="品种"></param>public void 进货(水果 品种){水果架.Add(品种);}/// <summary>/// 整理账目/// </summary>public void 整理账目(){水果架.Sort();}/// <summary>/// 超市盘点/// </summary>public void 盘点(){Console.WriteLine("一天的营业结束了,进行盘点...");foreach(水果 品种 in 水果架){Console.WriteLine("\t{0}: 单价为{1},今日营业额{2}。", 品种.名称, 品种.单价, 品种.营业额);}Console.WriteLine("盘点完毕");}}class Program{public static void Main(string[] args){水果 西瓜 = new 水果("西瓜", 1.00m, 800m);水果 苹果 = new 水果("苹果", 6.00m, 512m);水果 柑橘 = new 水果("柑橘", 2.00m, 2154m);水果 香蕉 = new 水果("香蕉", 7.00m, 127m);水果 猕猴桃 = new 水果("猕猴桃", 15.00m, 985m);超市 阳光超市 = new 超市();Console.WriteLine("超市开始营业了");阳光超市.进货(西瓜);阳光超市.进货(苹果);阳光超市.进货(柑橘);阳光超市.进货(香蕉);阳光超市.进货(猕猴桃);Console.WriteLine("没有整理就盘点...");阳光超市.盘点();Console.WriteLine();Console.WriteLine("整理以后盘点...");阳光超市.整理账目();阳光超市.盘点();// TODO: Implement Functionality HereConsole.Write("Press any key to continue . . . ");Console.ReadKey(true);}}#endregion#endif#if true#region 老板要看营业额,顾客要看单价/// <summary>/// 营业员好管理了,但是老板要看营业额,顾客需要看单价/// 程序员又得忙活了,用IComparer搞定。/// </summary>public class 水果 : IComparable{public enum 排序规则{老板要的,营业员要的,顾客要的}public string 名称;public decimal 单价;public decimal 营业额;public 水果(string 名称, decimal 单价, decimal 营业额){this.名称 = 名称;this.单价 = 单价;this.营业额 = 营业额;}#region IComparerpublic int CompareTo(object obj){水果 品种 = obj as 水果;return this.名称.CompareTo(品种.名称);}#endregionpublic class 老板要的排序 : IComparer{public int Compare(object x, object y){水果 s1 = x as 水果;水果 s2 = y as 水果;if (s1.营业额 == s2.营业额)return 0;else if (s1.营业额 > s2.营业额)return 1;elsereturn -1;}}public class 顾客要的排序 : IComparer{public int Compare(object x, object y){水果 s1 = x as 水果;水果 s2 = y as 水果;if (s1.单价 == s2.单价)return 0;else if (s1.单价 > s2.单价)return 1;elsereturn -1;}}}public class 超市{public ArrayList 水果架 = new ArrayList();/// <summary>/// 超市进货/// </summary>/// <param name="品种"></param>public void 进货(水果 品种){水果架.Add(品种);}/// <summary>/// 整理账目/// </summary>public void 整理账目(水果.排序规则 规则){switch(规则){case 水果.排序规则.老板要的:水果架.Sort((IComparer)new 水果.老板要的排序());break;case 水果.排序规则.顾客要的:水果架.Sort((IComparer)new 水果.顾客要的排序());break;default:水果架.Sort();break;}}public void 定制整理规则(){水果架.Sort();}/// <summary>/// 超市盘点/// </summary>public void 盘点(){Console.WriteLine("一天的营业结束了,进行盘点...");foreach(水果 品种 in 水果架){Console.WriteLine("\t{0}: 单价为{1},今日营业额{2}。", 品种.名称, 品种.单价, 品种.营业额);}Console.WriteLine("盘点完毕");}}class Program{public static void Main(string[] args){水果 西瓜 = new 水果("西瓜", 1.00m, 800m);水果 苹果 = new 水果("苹果", 6.00m, 512m);水果 柑橘 = new 水果("柑橘", 2.00m, 2154m);水果 香蕉 = new 水果("香蕉", 7.00m, 127m);水果 猕猴桃 = new 水果("猕猴桃", 15.00m, 985m);超市 阳光超市 = new 超市();Console.WriteLine("超市开始营业了");阳光超市.进货(西瓜);阳光超市.进货(苹果);阳光超市.进货(柑橘);阳光超市.进货(香蕉);阳光超市.进货(猕猴桃);Console.WriteLine("没有整理就盘点...");阳光超市.盘点();Console.WriteLine();Console.WriteLine("整理以后盘点...");阳光超市.整理账目(水果.排序规则.营业员要的);阳光超市.盘点();Console.WriteLine();Console.WriteLine("老板要看哪个卖的最好...");阳光超市.整理账目(水果.排序规则.老板要的);阳光超市.盘点();Console.WriteLine();Console.WriteLine("顾客要看哪个最便宜...");阳光超市.整理账目(水果.排序规则.顾客要的);阳光超市.盘点();// TODO: Implement Functionality HereConsole.Write("Press any key to continue . . . ");Console.ReadKey(true);}}#endregion#endif}
通过控制#if来进行两个程序的测试。这个接口很有用,对于数据整理还是很有好处的。