C#datetime索引数组的数量

时间:2016-02-09 19:00:54

标签: c# arrays datetime

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

我想输出两个具有相同datetime.hour的数组的索引号。并且它应该匹配array1中比array2晚的所有日期时间数据的最后一个可用索引号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点后它不会输出索引号。

2 个答案:

答案 0 :(得分:0)

这是因为当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]);
}

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

答案 1 :(得分:0)

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

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();
        }
    }
}