2012-08-03 55 views
0

如何使用System.Collections.Generic.List<T>.Sort對可爲null的int屬性排序列表?.net System.Collections.Generic.List <T> .sort nullable int

或者我必須做一個手動排序,因爲這是不可能的?

+4

你已經試過了什麼? – 2012-08-03 21:08:38

+1

......結果出了什麼問題? – 2012-08-03 21:09:29

+1

你的行爲是什麼?你希望第一次,最後一次? – vcsjones 2012-08-03 21:09:56

回答

6

首先,您需要確定如何將空值與具有值的項目進行比較。然後你可以進行比較。例如,如果你決定,空總是「小於」非空:

list.Sort((x,y) => { 
    if(!x.Nullable.HasValue) { 
    if(!y.Nullable.HasValue) return 0; // equal 
    else return -1; // y is greater 
    } 
    else 
    { 
    if(!y.Nullable.HasValue) return 1; // x is greater 
    if(x == y) return 0; // equal 
    if(x < y) return -1; // y is greater 
    else return 1; 
    } 
} 
+2

僅供參考,如果您想要考慮'null'小於非空值,那麼這就是默認的排序實現,只需調用'list.Sort( )'但是很好的例子。 – 2012-08-03 21:20:10

1

由於新手的開發要空首創,他們可以使用默認的排序實現:

List<int?> myList = new List<int?>() { 2, -3, null, 9 }; 

myList.Sort(); 

for (int i = 0; i < myList.Count; i++) 
    Console.WriteLine(myList[i]); //null, -3, 2, 9 

如果你這樣做需要不同的訂單,請使用Peter Ritchie的解決方案。

編輯:剛剛意識到,這可能是對列表中的一類的可爲空的屬性,在這種情況下使用LINQ的默認OrderBy實現:

public class MyClass 
{ 
    public int? Value; 
} 

List<MyClass> myList = new List<MyClass>() 
{ 
    new MyClass() { Value = 2}, 
    new MyClass() { Value = -3}, 
    new MyClass() { Value = null}, 
    new MyClass() { Value = 9}, 
}; 

var sorted = myList.OrderBy(entry => entry.Value).ToList(); 

for (int i = 0; i < sorted.Count; i++) 
    Console.WriteLine(sorted[i].Value); //null, -3, 2, 9 

另一種情況,如果你不希望使用LINQ,就是用List.Sort方法使用默認比較器:

myList.Sort((x, y) => 
    { 
     return System.Collections.Generic.Comparer<int?>.Default.Compare(x.Value, y.Value); 
    }); 
相關問題