数组的C#datetime索引数

数组的C#datetime索引数,c#,arrays,datetime,C#,Arrays,Datetime,我有两个数组,array1从上午8点到下午2点按分钟计算日期时间数据,array2从同一日期上午8点到下午1点按小时计算日期时间数据 我想输出具有相同datetime.hour的两个数组的索引号。并且它应该为array1中晚于array2的所有datetime数据匹配array2的最后可用索引号 例如,如果我有两个日期时间数组,如下所示: List<int> list = new List<int>(); List<int> list2 = new List&

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

我想输出具有相同datetime.hour的两个数组的索引号。并且它应该为array1中晚于array2的所有datetime数据匹配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),
};
这就是我尝试过的:

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]);
}
inti=0;
int j=0;
而(idateTimes2[j])
{
j++;
}
}
for(int k=0;k

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

这是因为
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]);
}
inti=0;
int j=0;
while(idateTimes2[j])
{
if(j

只有当第二个数组在第一个数组之前用完数据时,这才有效。

由于您修改后的问题暗示了泛型的使用,我将提供一个示例,说明如何使用泛型和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();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间控制台应用程序12
{
班级计划
{
静态void Main(字符串[]参数)
{
按分钟列出=新列表()
{
新的日期时间(2010、10、1、8、15、0),
新的日期时间(2010、10、1、8、30、1),
新的日期时间(2010、10、1、8、45、2),
新的日期时间(2010、10、1、9、15、3),
新的日期时间(2010、10、1、9、30、4),
新的日期时间(2010、10、1、9、45、5),
新的日期时间(2010、10、1、10、15、6),
新的日期时间(2010、10、1、10、30、7),
新的日期时间(2010,10,1,10,45,8),
新的日期时间(2010、10、1、11、15、9),
新的日期时间(2010、10、1、11、30、10),
新日期时间(2010、10、1、11、45、11),
新日期时间(2010、10、1、12、15、12),
新的日期时间(2010、10、1、12、30、13),
新的日期时间(2010、10、1、12、45、14),
新的日期时间(2010、10、1、13、15、15),
新的日期时间(2010、10、1、13、30、16),
新的日期时间(2010、10、1、13、45、17),
新的日期时间(2010、10、1、14、15、18),
新的日期时间(2010、10、1、14、30、19),
新日期时间(2010、10、1、14、45、20)
}; 
按小时列出=新列表()
{
新的日期时间(2010、10、1、8、0、0),
新的日期时间(2010、10、1、9、0、1),
新的日期时间(2010,10,1,10,0,2),
新的日期时间(2010、10、1、11、0、3),
新的日期时间(2010、10、1、12、0、4),
新的日期时间(2010、10、1、13、0、5),
新日期时间(2010、10、1、14、0、6)
};
var指数=按分钟计算
.选择(m=>新元组(
按分钟索引(m),
byHour.IndexOf(byHour.FirstOrDefault)(h=>h.Year==m.Year&&
h、 月份==m.月&&
h、 日=米日&&
h、 小时==米小时);
foreach(指数中的var indexItem)
{
WriteLine(“{0},{1}”,indexItem.Item1,indexItem.Item2);
}
Console.ReadKey();
}
}
}

在哪里定义了
列表
请执行以下操作,
1。显示所有相关代码2。使用调试器单步执行您自己的代码
另外,当一个数组明显大于另一个数组/包含的项比另一个数组多时,您希望如何获得正确的结果?您是否已单步执行了代码?
dateTimes1
中的最后3项与
dateTimes2
中的年、月、日不匹配,和小时级别。@juharr它与dateTime2中的年、月、日匹配,但与小时不匹配,因此我想输出dateTime1的最后三个索引号,以及dateTime2的最后一个可用索引号,就像我在上面写的一样。它正在工作,谢谢!
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();
        }
    }
}