您的位置:首页 > 编程语言 > C#

如何使用 Visual C# 中和 IComparer IComparable 接口

2010-01-20 20:21 239 查看

概要

本文介绍使用两个接口:IComparer和IComparable。同一项目中讨论这些接口有两个原因。这些接口常用一起,和虽然接口很相似(并具有类似名称),它们提供不同用途。

如果有数组类型(如字符串或整数)已经支持IComparer,则不提供任何显式引用到IComparer可排序该数组。数组的元素此时,都转换为IComparer(Comparer.Default)的默认实现对。但是,如果要提供排序或比较功能对于您自定义对象,必须实现任一或两个这些接口。

本文中引用.NETFrameworkClassLibrary下列命名空间:
System.Collections

IComparable

角色是IComparable是以提供方法来比较两个特定类型的对象。这是必需如果要为您对象提供任何排序功能。提供默认排序次序对您对象看作是IComparable。例如,如果有对象的您类型,数组并调用该数组,上排序方法IComparable提供对象比较期间排序。当实现IComparable接口,您必须实现CompareTo方法,如下所示:
//ImplementIComparableCompareTomethod-providedefaultsortorder.

intIComparable.CompareTo(objectobj)

{

carc=(car)obj;

returnString.Compare(this.make,c.make);

}

方法中比较是取决于正在进行比较,值数据类型不同。此示例中使用String.Compare因为属性是用于比较选择是字符串。

IComparer

角色的IComparer旨在提供其他比较机制。例如,您可能希望提供排序是按几个字段或属性,类升序和降序对同一字段,或两者

使用IComparer是一个两步过程。首先,声明类实现IComparer,并然后实现Compare方法:
privateclasssortYearAscendingHelper:IComparer

{

intIComparer.Compare(objecta,objectb)

{

carc1=(car)a;

carc2=(car)b;

if(c1.year>c2.year)

return1;

if(c1.year<c2.year)

return-1;

else

return0;

}

}

注意IComparer.Compare方法要求第三级比较。1,0或-1是返回根据一个值是大于、,等于或小于另一个。通过此方法中切换逻辑运算符更改排序次序(升序或降序)。

第二步是要返回您IComparer对象的一个实例方法声明:
publicstaticIComparersortYearAscending()

{

return(IComparer)newsortYearAscendingHelper();

}

当调用重载Array.Sort方法接受IComparer在本示例,对象用作第二个参数。使用IComparer不仅限于数组。它被接受多种不同集合和控件类中以参数形式。

分步示例

以下示例演示使用这些接口。为了演示IComparer和IComparable,创建一个名为汽车类。汽车对象具有使和年属性。有关通过IComparable接口,启用使字段和通过IComparer接口启用对使字段降序排序升序排序。为通过使用的IComparer年属性提供了升序和降序排序。
1.VisualC#,中新建控制台应用程序项目。名称ConsoleEnum应用程序。
2.命名作为Host.cs,Class,然后用以下代码替换代码。

注意重作为Host.cs入VisualStudio2005,命名Program.cs。

usingSystem;

namespaceConsoleEnum

{

classhost

{

[STAThread]

staticvoidMain(string[]args)

{

//Createanararyofcarobjects.

car[]arrayOfCars=newcar[6]

{

newcar("Ford",1992),

newcar("Fiat",1988),

newcar("Buick",1932),

newcar("Ford",1932),

newcar("Dodge",1999),

newcar("Honda",1977)

};

//Writeoutaheaderfortheoutput.

Console.WriteLine("Array-Unsorted/n");

foreach(carcinarrayOfCars)

Console.WriteLine(c.Make+"/t/t"+c.Year);

//DemoIComparablebysortingarraywith"default"sortorder.

Array.Sort(arrayOfCars);

Console.WriteLine("/nArray-SortedbyMake(Ascending-IComparable)/n");

foreach(carcinarrayOfCars)

Console.WriteLine(c.Make+"/t/t"+c.Year);

//DemoascendingsortofnumericvaluewithIComparer.

Array.Sort(arrayOfCars,car.sortYearAscending());

Console.WriteLine("/nArray-SortedbyYear(Ascending-IComparer)/n");

foreach(carcinarrayOfCars)

Console.WriteLine(c.Make+"/t/t"+c.Year);

//DemodescendingsortofstringvaluewithIComparer.

Array.Sort(arrayOfCars,car.sortMakeDescending());

Console.WriteLine("/nArray-SortedbyMake(Descending-IComparer)/n");

foreach(carcinarrayOfCars)

Console.WriteLine(c.Make+"/t/t"+c.Year);

//DemodescendingsortofnumericvalueusingIComparer.

Array.Sort(arrayOfCars,car.sortYearDescending());

Console.WriteLine("/nArray-SortedbyYear(Descending-IComparer)/n");

foreach(carcinarrayOfCars)

Console.WriteLine(c.Make+"/t/t"+c.Year);

Console.ReadLine();

}

}

}


3.向项目添加类。命名类汽车。
4.用下列替换代码Car.cs中:
usingSystem;

usingSystem.Collections;

namespaceConsoleEnum

{

publicclasscar:IComparable

{

//Beginningofnestedclasses.

//Nestedclasstodoascendingsortonyearproperty.

privateclasssortYearAscendingHelper:IComparer

{

intIComparer.Compare(objecta,objectb)

{

carc1=(car)a;

carc2=(car)b;

if(c1.year>c2.year)

return1;

if(c1.year<c2.year)

return-1;

else

return0;

}

}

//Nestedclasstododescendingsortonyearproperty.

privateclasssortYearDescendingHelper:IComparer

{

intIComparer.Compare(objecta,objectb)

{

carc1=(car)a;

carc2=(car)b;

if(c1.year<c2.year)

return1;

if(c1.year>c2.year)

return-1;

else

return0;

}

}

//Nestedclasstododescendingsortonmakeproperty.

privateclasssortMakeDescendingHelper:IComparer

{

intIComparer.Compare(objecta,objectb)

{

carc1=(car)a;

carc2=(car)b;

returnString.Compare(c2.make,c1.make);

}

}

//Endofnestedclasses.

privateintyear;

privatestringmake;

publiccar(stringMake,intYear)

{

make=Make;

year=Year;

}

publicintYear

{

get{returnyear;}

set{year=value;}

}

publicstringMake

{

get{returnmake;}

set{make=value;}

}

//ImplementIComparableCompareTotoprovidedefaultsortorder.

intIComparable.CompareTo(objectobj)

{

carc=(car)obj;

returnString.Compare(this.make,c.make);

}

//MethodtoreturnIComparerobjectforsorthelper.

publicstaticIComparersortYearAscending() { return(IComparer)newsortYearAscendingHelper(); }//MethodtoreturnIComparerobjectforsorthelper.

publicstaticIComparersortYearDescending()

{

return(IComparer)newsortYearDescendingHelper();

}

//MethodtoreturnIComparerobjectforsorthelper.

publicstaticIComparersortMakeDescending()

{

return(IComparer)newsortMakeDescendingHelper();

}

}

}


5.运行项目。以下输出出现在控制台窗口:
Array-Unsorted

Ford1992

Fiat1988

Buick1932

Ford1932

Dodge1999

Honda1977

Array-SortedbyMake(Ascending-IComparable)

Buick1932

Dodge1999

Fiat1988

Ford1932

Ford1992

Honda1977

Array-SortedbyYear(Ascending-IComparer)

Ford1932

Buick1932

Honda1977

Fiat1988

Ford1992

Dodge1999

Array-SortedbyMake(Descending-IComparer)

Honda1977

Ford1932

Ford1992

Fiat1988

Dodge1999

Buick1932

Array-SortedbyYear(Descending-IComparer)

Dodge1999

Ford1992

Fiat1988

Honda1977

Buick1932

Ford1932

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: