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); } (感谢评论者指出我方法中的缺陷.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ruby-on-rails – 是否存在Ruby 1.8.7 time.strftime%z错误
- VB.NET中DirectCast()和CType()之间的区别
- Swift37/90Days - iOS 中的设计模式 (Swift 版本) 02
- XML_DOM_解析本地文件
- jpush-react-native 插件的集成与使用 Android 篇
- ajax动态二级表单联动
- error C2338: You've instantiated std::aligned_stora
- 匹配标签的正则(用于抽取纯文本)
- objective-c – 如果Protocol方法标记为@required,则在未实
- 如何在C#.net中将EBCDIC转换为ASCII