您的位置:首页 > 其它

用IComparable和IComparer来设置排序规则

2012-12-24 16:12 337 查看
只来干的,不来稀的。

/*
* 由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来进行两个程序的测试。这个接口很有用,对于数据整理还是很有好处的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: