2009-10-06 77 views
6

如何在兩個字符串字段上實現IComparable接口?在兩個字符串字段上實現IComparable接口

使用下面的Person類示例。如果Person對象被添加到列表中。我如何根據姓氏首先排序列表THEN Forename?

Class Person 
{ 
    public string Surname { get; set; } 
    public string Forname { get; set; } 
} 

有點像? :

myPersonList.Sort(delegate(Person p1, Person p2) 
{ 
    return p1.Surname.CompareTo(p2. Surname); 
}); 

回答

9

或者你可以排序像這樣的列表:

myPersonList.Sort(delegate(Person p1, Person p2) 
{ 
    int result = p1.Surname.CompareTo(p2.Surname); 
    if (result == 0) 
     result = p1.Forname.CompareTo(p2.Forname); 
    return result; 
}); 

或者你可以有Person實現IComparable<Person>用這種方法:

public int CompareTo(Person other) 
{ 
    int result = this.Surname.CompareTo(other.Surname); 
    if (result == 0) 
     result = this.Forname.CompareTo(other.Forname); 
    return result; 
} 

編輯正如馬克評論說,你可能會決定你需要檢查空值。如果是這樣,你應該決定是否將空值排序到頂部或底部。類似這樣的:

if (p1==null && p2==null) 
    return 0; // same 
if (p1==null^p2==null) 
    return p1==null ? 1 : -1; // reverse this to control ordering of nulls 
+0

記得檢查生產實現中的空值... – 2009-10-06 12:17:42

+0

檢查.Surname中的空值怎麼辦? – mayu 2011-07-05 09:18:05

+0

@Tymec,只需重複使用與p1和p2相同的模式,但使用p1.Surname和p2.Surname。 – 2011-07-07 06:06:11

1

試試這個嗎?

int surnameComparison = p1.Surname.CompareTo(p2.Surname); 

if (surnameComparison <> 0) 
    return surnameComparison; 
else 
    return p1.Forename.CompareTo(p2.Forename);