簡體   English   中英

C#datetime數組

[英]C# datetime array

我有兩個數組,array1具有從上午8點到下午2點的分鍾的日期時間數據,而array2具有從同一天的早上8點到下午1點的日期時間數據。

我想輸出具有相同datetime.hour的兩個數組的索引號。 並且它應該匹配array1中比array2晚的所有日期時間數據的最后一個可用索引號array2。

例如,如果我有兩個這樣的日期時間數組:

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點后輸出索引號。

你的兩個名單的長度不一樣。 while語句中,您嘗試同時迭代兩個不同長度的列表。

如果我理解你的要求你應該通過使用循環來做這樣的事情:

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;
    while (i < dateTimes1.Length)
    {
        int j = 0;
        while (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];
    }       

這是使用Array.FindIndexforeach的一個非常基本的方法:

編輯:更新此答案,以處理“ 匹配array1的所有日期時間數據的array2的最后一個可用索引號,比array2更晚。 ”問題。

foreach (DateTime dt in dateTimes1)
{   
    int currentHour = dt.Hour;
    int lastHour = dateTimes2[dateTimes2.GetUpperBound(0)].Hour; //GetUpperBound(0) is the last index

    int dt1index = Array.FindIndex(dateTimes1, a => a == dt); //get the index of the current item in dateTimes1
    int dt2index = Array.FindIndex(dateTimes2, x => x.Hour == currentHour); //get the index of the item in dateTimes2 matching dateTimes1 hour field        

    if (currentHour > lastHour)
    {
        Console.WriteLine("{0}, {1}", dt1index, dateTimes2.GetUpperBound(0));
    }
    else
    {
        Console.WriteLine("{0}, {1}", dt1index, dt2index);
    }             

}

這只是查看dateTimes1dateTimes2中的每個值,並返回它找到的第一個匹配(非常類似於你的循環)。

為了確定dt1index ,我們查看dateTimes1並返回第一個匹配,其中a => a == dt (a只是謂詞,表示dateTimes1的“當前”值 - 想到i = 0,1,2,etc常規循環)。

同樣,為了確定dt2index ,我們在x => x.Hour == dt.Hour上尋找第一個匹配 - 也就是說,“當前” dt的小時字段與dateTimes2的小時字段匹配。

在這兩種情況下,都會返回第一個匹配項 - 如果未找到匹配項,則返回-1

我們去的時候寫到控制台,我們檢查,如果currentHour比在最后一小時更大dateTimes2如果是這樣,我們只是寫的當前索引dateTimes1和最后一個索引dateTimes2 否則,我們寫的當前索引dateTimes1以及其中小時的匹配指數dateTimes2

使用Linq:

var hour = new TimeSpan(1, 0, 0);
var dt2MaxValue = dateTimes2.Max();
for (int i = 0; i < dateTimes1.Length; i++)
{
    var output = string.Format("{0}, {1}",
        i,
        dateTimes2
           .Select((o, index) => new { index = index, value = o })
           .Where(dt2 => (dateTimes1[i] - dt2.value) < hour 
                           || dt2.value == dt2MaxValue)
           .Select(dt2 => dt2.index)
           .FirstOrDefault());
    Console.WriteLine(output);
}

以上Linq聲明的作用是什么:

  • 第一個Select使用該方法的重載,該重載也傳遞項的索引。 這只是允許信息級聯。 它使用一個匿名對象,索引和集合項分別是indexvalue屬性。

  • Where子句查詢這些匿名對象的集合,並將它們的valuedateTime1[i]進行比較。 它得到了一個地方value小於dateTime1[i]但不超過1小時, 或者如果它的最大value在整個收藏。

  • 第二個Select只是獲取Where濾過的項目的索引。

  • 並且FirstOrDefault僅返回該值(即,第一個或默認值,即所選項目的索引,如果未選擇任何項目則為0)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM