如何使用System.Collections.Generic.List<T>.Sort
对可空的int属性进行排序?
或者我必须进行手动分类,因为那是不可能的吗?
答案 0 :(得分:6)
首先,您需要确定空值如何与具有值的项目进行比较。然后你可以进行比较。例如,如果您确定null始终“小于”非null:
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;
}
}
答案 1 :(得分:1)
由于newbie dev想要空第一,他们可以使用默认的排序实现:
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);
});