用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 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来进行两个程序的测试。这个接口很有用,对于数据整理还是很有好处的。

你可能感兴趣的:(用IComparable和IComparer来设置排序规则)