只来干的,不来稀的。
/* * 由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 IComparable public 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 Here Console.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 IComparer public int CompareTo(object obj) { 水果 品种 = obj as 水果; return this.名称.CompareTo(品种.名称); } #endregion 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; else return -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; else return -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 Here Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } #endregion #endif }
通过控制#if来进行两个程序的测试。这个接口很有用,对于数据整理还是很有好处的。