在含有null值的复杂类的集合(Collection)中取最大值
2024-09-09 05:27:34
在日常编程中,经常遇到要在一组复杂类的集合(Collection)中做比较、取最大值或最小值。
举个最简单的例子,我们要在一个如下结构的集合中选取包含最大值的元素:
public class Class<T> where T : struct
{
public T? Value { get; set; }
}
var ints = new List<Class<int>>()
{
new Class<int>() { Value = },
new Class<int>() { Value = },
new Class<int>() { Value = },
new Class<int>() { Value = },
};
如果不使用.Net高级特性的做法通常是:
var max = new Class<int>() { Value = Int32.MinValue };
foreach (var i in ints)
{
if (i.Value != null && i.Value > max.Value)
{
max = i;
}
} return max;
这样的写法,除了烦琐无味以外,还有一个很明显的Bug,虽然在上面这个例子中暴露不出来,但是假设集合没有一个元素,或者组成如下:
var ints = new List<Class<int>>()
{
new Class<int>() { Value = null },
new Class<int>() { Value = null },
new Class<int>() { Value = null },
};
此时此刻,我们想要返回的是包含null值的元素,而上述方法则带给我们包含Int32最小值的元素,此元素并不在ints集合中!
你会想使用Linq框架的Max(),比如:
var max = ints.Max(i => i.Value);
但事实上这个方法只能返回元素的Value成员变量,也就是int?类型,所以这也不是我们想要的。
此时此刻,正确的方法可能是:
var max = ints.First(i => i.Value == ints.Max(j => j.Value));
但,这还是有机会抛异常的,假设集合如下
var ints = new List<Class<int>>()
{
new Class<int>() { Value = null },
new Class<int>() { Value = null },
new Class<int>() { Value = null },
null
};
在这个集合里我们加了一个真正的null元素(而非包含null值的元素),ints.Max()就会抛NullReferenceException。
为了解决这个问题,我们可以将max声明改写为:
var max = ints.First(i => i.Value == ints.Max(j => { return j == null ? null : j.Value; }));
你可能已经注意到了,Max()方法中加了null值判断,但First()方法中却不需要。请先不要急于抱怨微软设计的集合方法有行为不一致的现象。
至于为什么,我将这个作业交给你,先自己在下面这个链接里挖掘一下答案吧。:)
http://referencesource.microsoft.com/
(此网站是微软早在两年前建设好的用于方便软件工程师查看.Net源代码的网站)
最新文章
- centos yum update kernel
- centos 安装pptp
- Nginx 502 bad gateway问题的解决方法
- C++ Base64 编码 解码
- 修改Map中确定key对应的value问题
- 原来真的不会用指针[*p++]
- 左右Map
- SQL server 用命令行更改数据库
- java的字符串操作和for循环的使用
- sqlsever 科学计数法 转标准值
- NTP 时间同步协议
- 20165319 Exp6 信息收集与漏洞扫描
- Pinpoint在Win7下搭建
- zabbix3.0.4报错Get value from agent failed: cannot connect to [[1.1.1.1]:10050]: [4] Interrupted syste
- 浅谈transient关键字
- UI5-文档-4.7-JSON Model
- LruCache源码分析
- python simple factory mode example
- POJ No 3259 Wormholes Bellman-Ford 判断是否存在负图
- SVG图形的简单修改