У меня есть список объектов, некоторые из которых могут быть нулевыми. Я хочу, чтобы это сортировалось по какому-либо свойству, с null
s в конце списка. Тем не менее, метод List<T>.Sort()
, похоже, ставит null
s в начале независимо от того, что возвращает компаратор. Это небольшая программа, которую я использовал для проверки этого:
class Program
{
class Foo {
public int Bar;
public Foo(int bar)
{
Bar = bar;
}
}
static void Main(string[] args)
{
List<Foo> list = new List<Foo>{null, new Foo(1), new Foo(3), null, new Foo(100)};
foreach (var foo in list)
{
Console.WriteLine("Foo: {0}", foo==null?"NULL":foo.Bar.ToString());
}
Console.WriteLine("Sorting:");
list.Sort(new Comparer());
foreach (var foo in list)
{
Console.WriteLine("Foo: {0}", foo == null ? "NULL" : foo.Bar.ToString());
}
Console.ReadKey();
}
class Comparer:IComparer<Foo>
{
#region Implementation of IComparer<in Foo>
public int Compare(Foo x, Foo y)
{
int xbar = x == null ? int.MinValue : x.Bar;
int ybar = y == null ? int.MinValue : y.Bar;
return ybar - xbar;
}
#endregion
}
}
Попробуйте сами: отсортированный список печатается как
Foo: NULL
Foo: NULL
Foo: 100
Foo: 3
Foo: 1
null
s Сначала, даже если их сравнивают как int.Minvalue
. Метод глючит или как?