数组的 C# 日期时间索引号

本文关键字:索引 时间 日期 数组 | 更新日期: 2023-09-27 18:33:51

我有两个数组,array1 具有从上午 8 点到下午 2 点按分钟计算的日期时间数据,array2 具有从同一日期上午 8 点到下午 1 点按小时计算的日期时间数据。

我想输出两个具有相同 datetime.hour 的数组的索引号,并且它应该与 array2 中所有 Array1 中晚于 array2 的日期时间数据的最后一个可用索引号相匹配。

例如,如果我有两个这样的日期时间数组:

List<int> list = new List<int>();
List<int> list2 = new List<int>();
DateTime[] dateTimes1 = new DateTime[]
{
    new DateTime(2010, 10, 1, 8, 15, 0),
    new DateTime(2010, 10, 1, 8, 30, 1),
    new DateTime(2010, 10, 1, 8, 45, 2),
    new DateTime(2010, 10, 1, 9, 15, 3),
    new DateTime(2010, 10, 1, 9, 30, 4),
    new DateTime(2010, 10, 1, 9, 45, 5),
    new DateTime(2010, 10, 1, 10, 15, 6),
    new DateTime(2010, 10, 1, 10, 30, 7),
    new DateTime(2010, 10, 1, 10, 45, 8),
    new DateTime(2010, 10, 1, 11, 15, 9),
    new DateTime(2010, 10, 1, 11, 30, 10),
    new DateTime(2010, 10, 1, 11, 45, 11),
    new DateTime(2010, 10, 1, 12, 15, 12),
    new DateTime(2010, 10, 1, 12, 30, 13),
    new DateTime(2010, 10, 1, 12, 45, 14),
    new DateTime(2010, 10, 1, 13, 15, 15),
    new DateTime(2010, 10, 1, 13, 30, 16),
    new DateTime(2010, 10, 1, 13, 45, 17),
    new DateTime(2010, 10, 1, 14, 15, 18),
    new DateTime(2010, 10, 1, 14, 30, 19),
    new DateTime(2010, 10, 1, 14, 45, 20),
};
DateTime[] dateTimes2 = new DateTime[]
{
    new DateTime(2010, 10, 1, 8, 0, 0),
    new DateTime(2010, 10, 1, 9, 0, 1),
    new DateTime(2010, 10, 1, 10, 0, 2),
    new DateTime(2010, 10, 1, 11, 0, 3),
    new DateTime(2010, 10, 1, 12, 0, 4),
    new DateTime(2010, 10, 1, 13, 0, 5),
};

这应该是我期望的输出:

0, 0
1, 0
2, 0
3, 1
4, 1
5, 1
6, 2
7, 2
8, 2
9, 3
10, 3
11, 3
12, 4
13, 4
14, 4
15, 5
16, 5
17, 5
18, 5
19, 5
20, 5

这是我尝试过的:

int i = 0;
int j = 0;
while (i < dateTimes1.Length && j < dateTimes2.Length)
{     
    if (dateTimes1[i].Date == dateTimes2[j].Date && dateTimes1[i].Hour == dateTimes2[j].Hour)
    {
        list.Add(i);
        list2.Add(j);
        i++;
    }
    else if (dateTimes1[i] < dateTimes2[j])
    {
        i++;
    }
    else if (dateTimes1[i] > dateTimes2[j])
    {
        j++;
    }
}
for (int k = 0; k < list.Count; k++)
{
    Console.WriteLine(list[k] + " , " + list2[k]);
}

但它不会在下午 1 点之后输出索引号。

数组的 C# 日期时间索引号

由于您修订后的问题暗示了泛型的使用,因此我将提供一个示例,说明如何使用泛型和 LINQ 来实现此目的。元组的第二部分变得有点复杂,部分原因是您的日期时间都增加了它们的秒数。看一下,运行代码,看看这是否适合您的需求......

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication12
{
    class Program
    {
        static void Main(string[] args)
        {
            List<DateTime> byMinute = new List<DateTime>()
            {
                new DateTime(2010, 10, 1, 8, 15, 0),
                new DateTime(2010, 10, 1, 8, 30, 1),
                new DateTime(2010, 10, 1, 8, 45, 2),
                new DateTime(2010, 10, 1, 9, 15, 3),
                new DateTime(2010, 10, 1, 9, 30, 4),
                new DateTime(2010, 10, 1, 9, 45, 5),
                new DateTime(2010, 10, 1, 10, 15, 6),
                new DateTime(2010, 10, 1, 10, 30, 7),
                new DateTime(2010, 10, 1, 10, 45, 8),
                new DateTime(2010, 10, 1, 11, 15, 9),
                new DateTime(2010, 10, 1, 11, 30, 10),
                new DateTime(2010, 10, 1, 11, 45, 11),
                new DateTime(2010, 10, 1, 12, 15, 12),
                new DateTime(2010, 10, 1, 12, 30, 13),
                new DateTime(2010, 10, 1, 12, 45, 14),
                new DateTime(2010, 10, 1, 13, 15, 15),
                new DateTime(2010, 10, 1, 13, 30, 16),
                new DateTime(2010, 10, 1, 13, 45, 17),
                new DateTime(2010, 10, 1, 14, 15, 18),
                new DateTime(2010, 10, 1, 14, 30, 19),
                new DateTime(2010, 10, 1, 14, 45, 20) 
            }; 
            List<DateTime> byHour = new List<DateTime>()
            {
                new DateTime(2010, 10, 1, 8, 0, 0),
                new DateTime(2010, 10, 1, 9, 0, 1),
                new DateTime(2010, 10, 1, 10, 0, 2),
                new DateTime(2010, 10, 1, 11, 0, 3),
                new DateTime(2010, 10, 1, 12, 0, 4),
                new DateTime(2010, 10, 1, 13, 0, 5),
                new DateTime(2010, 10, 1, 14, 0, 6)
            };
            var index = byMinute
                .Select(m => new Tuple<int,int>(
                    byMinute.IndexOf(m), 
                    byHour.IndexOf(byHour.FirstOrDefault(h => h.Year == m.Year &&
                        h.Month ==  m.Month &&
                        h.Day == m.Day &&
                        h.Hour == m.Hour))));
            foreach(var indexItem in index)
            {
                Console.WriteLine("{0}, {1}", indexItem.Item1, indexItem.Item2);
            }
            Console.ReadKey();
        }
    }
}

这是因为你的while的条件使它停止j到达数组dateTimes2末尾。 当你到达j == 5时,循环结束。

试试这个:

int i = 0;
int j = 0;
while (i < dateTimes1.Length)
{     
    if (dateTimes1[i].Date == dateTimes2[j].Date && dateTimes1[i].Hour == dateTimes2[j].Hour)
    {
        list.Add(i);
        list2.Add(j);
        i++;
    }
    else if (dateTimes1[i] < dateTimes2[j])
    {
        i++;
    }
    else if (dateTimes1[i] > dateTimes2[j])
    {
        if (j < dateTimes2.Length - 1)
        {
            j++;
        }
    }
}
for (int k = 0; k < list.Count; k++)
{
    Console.WriteLine(list[k] + " , " + list2[k]);
}

仅当第二个数组在第一个数组之前耗尽数据时,这才有效。