1. 程式人生 > >C# 用實例來理解IComparable和IComparer

C# 用實例來理解IComparable和IComparer

大於 sum summary spa 必須 理解 實例 eap bject

通過Array的Sort方法來理解的 Sort方法要 通過對象去繼承IComparable接口來實現排序(當然也有其它辦法),我想入門這可能就是對這句話有點不理解,在下面會有註釋

技術分享 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace ConsoleApplication1
{
/// <summary>
/// 設置FirstName和LastName兩個屬性為排序條件,對person安姓名進行排序
/// </summary>
public class Person : IComparable
{
private string _firstName;
/// <summary>
/// 第一個字母
/// </summary>
public string FirstName
{
get { return _firstName; }
set { _firstName = value; }
}
private string _lastName;
/// <summary>
/// 第二個字母
/// </summary>
public string LastName
{
get { return _lastName; }
set { _lastName = value; }
}
public Person(string firstName, string lastName)
{
_firstName = firstName;
_lastName = lastName;
}
//理解接口的作用,在這裏 繼承了IComparable接口,使得Person類必須實現這個接口(實現接口 就是 實現CompareTo方法,Array.Sort排序的時候 只認CompareTo方法,如果沒有繼承接口,就算有這個方法 也是會拋出異常)
//實現接口後在Array中 能通過這個被實現的接口方法(規定好了是CompareTo方法),根據返回值 而去處理sort方法(在Array.Sort 中已經規定了ComapreTo方法 返回值代表的意義),這樣在Person中就可以 由用戶
//自己在CompareTo方法中隨便的去定義 方法的實現方式,只要返回值滿足 規定 即可,真是 妙極了(0相等1大於-1小於)
public int CompareTo(object obj)
{
Person other = obj as Person;
//先比較LastName,如果是0則繼續比較FirstName
int result = this.LastName.CompareTo(other.LastName);
if (result == 0)
{
result = this.FirstName.CompareTo(other.FirstName);
}
return result;
}
public override string ToString()
{
return FirstName + " " + LastName;
}
}


class Program
{
static void Main(string[] args)
{
Person[] persons = { new Person("z","l"),
new Person("w","x"),
new Person("l","s"),
new Person("l","m"),
new Person("a","l")};
Array.Sort(persons);//排序
foreach (Person p in persons)
{
Console.WriteLine(p);
}

}
}
} 技術分享

上面的情況是 可以對 Person類進行修改的情況下的做法,如果不能修改Person呢,這個時候就要IComparer接口大顯身手了

利用了Sort方法的重載,添加一個對IComparer接口的實現的接口即可

技術分享 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace ConsoleApplication1
{
/// <summary>
/// 設置FirstName和LastName兩個屬性為排序條件,對person安姓名進行排序
/// </summary>
public class Person //: IComparable
{
private string _firstName;
/// <summary>
/// 第一個字母
/// </summary>
public string FirstName
{
get { return _firstName; }
set { _firstName = value; }
}
private string _lastName;
/// <summary>
/// 第二個字母
/// </summary>
public string LastName
{
get { return _lastName; }
set { _lastName = value; }
}
public Person(string firstName, string lastName)
{
_firstName = firstName;
_lastName = lastName;
}
//理解接口的作用,在這裏 繼承了IComparable接口,使得Person類必須實現這個接口(實現接口 就是 實現CompareTo方法,Array.Sort排序的時候 只認CompareTo方法,如果沒有繼承接口,就算有這個方法 也是會拋出異常)
//實現接口後在Array中 能通過這個被實現的接口方法(規定好了是CompareTo方法),根據返回值 而去處理sort方法(在Array.Sort 中已經規定了ComapreTo方法 返回值代表的意義),這樣在Person中就可以 由用戶
//自己在CompareTo方法中隨便的去定義 方法的實現方式,只要返回值滿足 規定 即可,真是 妙極了(0相等1大於-1小於)
public int CompareTo(object obj)
{
Person other = obj as Person;
//先比較LastName,如果是0則繼續比較FirstName
int result = this.LastName.CompareTo(other.LastName);
if (result == 0)
{
result = this.FirstName.CompareTo(other.FirstName);
}
return result;
}
public override string ToString()
{
return FirstName + " " + LastName;
}
}
/// <summary>
/// 架設Person是不允許我們去修改的,這個時候我們就用IComparer接口,然後Sort根據被實現的Compaer方法去排序
/// </summary>
public class PersonComparer : IComparer
{
/// <summary>
/// 枚舉,排序條件
/// </summary>
public enum PersonCompareType
{
/// <summary>
/// 第一個名字
/// </summary>
FirstName,
LastName
}
private PersonCompareType compareType;
public PersonComparer(PersonCompareType compareType)
{
this.compareType = compareType;
}
public int Compare(object x, object y)
{
Person p1 = x as Person;
Person p2 = y as Person;
switch (compareType)
{
case PersonCompareType.FirstName:
return p1.FirstName.CompareTo(p2.FirstName);

case PersonCompareType.LastName:
return p1.LastName.CompareTo(p2.LastName);

default:
throw new ArgumentException("必須指定比較類型");
}

}
}


class Program
{
static void Main(string[] args)
{
Person[] persons = { new Person("z","l"),
new Person("w","x"),
new Person("l","s"),
new Person("l","m"),
new Person("a","l")};
Array.Sort(persons);//排序
foreach (Person p in persons)
{
Console.WriteLine(p);
}
Console.WriteLine("-----------------");
//註意這個地方的方法重載
Array.Sort(persons, new PersonComparer(PersonComparer.PersonCompareType.FirstName));
foreach (Person p in persons)
{
Console.WriteLine(p);
}
Console.WriteLine("-----------------");
Array.Sort(persons, new PersonComparer(PersonComparer.PersonCompareType.LastName));
foreach (Person p in persons)
{
Console.WriteLine(p);
}

}
}
} 技術分享

C# 用實例來理解IComparable和IComparer