加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – List.Sort错误地排序空值

发布时间:2020-12-15 20:53:39 所属栏目:百科 来源:网络整理
导读:我有一个对象列表,其中一些可以为null.我希望它按一些属性排序,列表末尾有空值.但是,无论比较器返回什么,List T .Sort()方法似乎都会在开头放置空值.这是我用来测试这个的一个小程序: class Program { class Foo { public int Bar; public Foo(int bar) { B
我有一个对象列表,其中一些可以为null.我希望它按一些属性排序,列表末尾有空值.但是,无论比较器返回什么,List< T> .Sort()方法似乎都会在开头放置空值.这是我用来测试这个的一个小程序:

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

nulls是第一个,即使它们被比作int.Minvalue.这个方法是错误还是什么?

解决方法

假设x为null且y为1.

int xbar = x == null ? int.MinValue : x.Bar;
int ybar = y == null ? int.MinValue : y.Bar;
return ybar - xbar;

所以现在我们有1 – int.MinValue.这将是溢出,因此最终结果将为负,因此null将被视为小于1.

出于这个原因,计算从根本上是有缺陷的.

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.CompareTo(xbar);
}

(感谢评论者指出我方法中的缺陷.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读