如何根据源数组的两个索引匹配第二个数组的首个最近日期索引?
问题:基于长数组的索引区间匹配短数组的目标日期索引
测试数组示例
Long_Array(长数组)
| 索引 | 日期 |
|---|---|
| 0 | 20180101 |
| 1 | 20180605 |
| 2 | 20181115 |
| 3 | 20190225 |
| 4 | 20190714 |
| 5 | 20200321 |
| 6 | 20210110 |
Short_Array(短数组)
| 索引 | 日期 |
|---|---|
| 0 | 20170906 |
| 1 | 20171218 |
| 2 | 20180112 |
| 3 | 20180216 |
| 4 | 20180425 |
| 5 | 20180520 |
| 6 | 20180603 |
| 7 | 20180721 |
| 8 | 20180817 |
需求说明
给定长数组的两个连续索引(如示例中的0和1),需要在短数组中找到两个目标索引:
- 第一个索引:首个日期大于等于长数组索引0对应日期的元素(示例中对应短数组索引2的20180112)
- 第二个索引:最后一个日期小于长数组索引1对应日期的元素(示例中对应短数组索引6的20180603)
示例预期输出为:2和6
现有代码问题
你编写的代码如下:
int indexFrom = Array.FindIndex(Short_Array, row => Convert.ToInt32(row.Date) >= Convert.ToInt32(Long_Array[i].Date)); int indexTo = Array.FindIndex(Short_Array, row => Convert.ToInt32(row.Date) < Convert.ToInt32(Long_Array[i + 1].Date));
问题出在indexTo的获取逻辑:Array.FindIndex会返回第一个满足条件的元素索引,而你需要的是最后一个符合条件的元素索引。比如示例中,短数组里第一个小于20180605的元素是索引0,完全不符合预期。
解决方案
方法1:使用Array.FindLastIndex
直接用Array.FindLastIndex查找最后一个符合条件的元素,同时优化日期转换的类型避免溢出:
// 预先转换日期为长整数,避免重复转换且防止Int32溢出 long longDateFrom = Convert.ToInt64(Long_Array[i].Date); long longDateTo = Convert.ToInt64(Long_Array[i + 1].Date); // 找首个大于等于目标起始日期的元素索引 int indexFrom = Array.FindIndex(Short_Array, row => Convert.ToInt64(row.Date) >= longDateFrom); // 找最后一个小于目标结束日期的元素索引 int indexTo = Array.FindLastIndex(Short_Array, row => Convert.ToInt64(row.Date) < longDateTo);
方法2:使用LINQ查询
如果项目允许使用LINQ,可通过索引筛选实现:
var longDateFrom = Convert.ToInt64(Long_Array[i].Date); var longDateTo = Convert.ToInt64(Long_Array[i + 1].Date); // 获取首个符合起始条件的元素索引,无匹配则返回-1 int indexFrom = Short_Array.Select((row, idx) => new { row, idx }) .FirstOrDefault(x => Convert.ToInt64(x.row.Date) >= longDateFrom)? .idx ?? -1; // 获取最后一个符合结束条件的元素索引,无匹配则返回-1 int indexTo = Short_Array.Select((row, idx) => new { row, idx }) .LastOrDefault(x => Convert.ToInt64(x.row.Date) < longDateTo)? .idx ?? -1;
额外优化建议
- 预先转换日期:将两个数组的日期字符串一次性转换为
long类型存储,避免重复转换提升性能。 - 边界处理:添加无匹配时的默认值(如-1),避免空引用异常。
内容的提问来源于stack exchange,提问作者Masoud
相关产品推荐
相关产品推荐

