如何使用LINQ计算可空Int32类型List中相邻元素的差值
实现方案
完全可以通过LINQ实现,核心用Zip方法配对相邻元素,再补首位null即可。
完整代码示例
List<Int32?> numbers = new List<Int32?> { 2, 1, 3, null, 6, 7 }; var result = numbers // 配对原列表和跳过首元素的列表,得到所有相邻元素对 .Zip(numbers.Skip(1), (previous, current) => // 仅两个元素都不为空时计算差值,否则返回null previous.HasValue && current.HasValue ? current - previous : null) // 首位补null,和原列表长度对齐 .Prepend(null) .ToList();
逻辑说明
- 配对后生成的相邻元素对依次为:
(2,1)、(1,3)、(3,null)、(null,6)、(6,7) - 按照规则计算得到5个差值:
-1、2、null、null、1 - 首位置补
null后,最终输出结果为{ null, -1, 2, null, null, 1 },完全符合预期要求。
低版本.NET兼容写法
如果使用的.NET Framework版本不支持Prepend方法,可以用Concat实现相同效果:
var result = new Int32?[] { null } .Concat(numbers.Zip(numbers.Skip(1), (previous, current) => previous.HasValue && current.HasValue ? current - previous : null)) .ToList();
内容的提问来源于stack exchange,提问作者Miguel Moura
相关产品推荐
相关产品推荐

