2016-02-09 114 views
4

我有兩個陣列,ARRAY1具有由從上午08點分鐘日期時間數據計數至下午和數組2具有從同一日期上午08點到下午1點由小時日期時間數據計數。C#日期時間陣列

欲輸出的兩個陣列,其具有相同的datetime.hour索引號。並且它應該爲array1之後的所有日期時間數據匹配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 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點後輸出索引編號。

+5

尼斯初學者練習。你嘗試了什麼?或者你認爲我們是「免費編寫我的代碼」服務?我們通常希望人們有基於代碼的編程問題。他們沒有把作業放在我們身上,所以他們從不學習編程。 – TomTom

+0

你有試過什麼嗎?循環會很簡單,但效率不高 - 嘗試一下,看看你能不能;稍後再提出一個更有效的方法。 –

+0

「datetime data count」和「array2的最後一個可用計數器」的含義並不完全清楚。數組中的元素不是計數器,它們只是'DateTime'值。請澄清。如果你使用'DateTime'的Second部分作爲計數器,我強烈建議你現在就停止這樣做。 –

回答

1

你的兩個列表是不一樣的長度。在你的聲明你試圖同時迭代兩個不同長度的列表。

如果我理解您的需求正常,你應該使用循環做這樣的事情:

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]; 
    }  
0

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

編輯:更新此回答處理「匹配array2的所有日期時間數據的最後一個可用索引號,該數組來自array1後面的」問題。

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(一個僅僅是謂語,代表dateTimes1「當前」價值 - 在常規循環想到i = 0,1,2,etc)。

同樣,確定dt2index,我們尋找的第一場比賽上x => x.Hour == dt.Hour - 也就是說,在「當前」 dt的小時字段dateTimes2小時字段匹配。

在這兩種情況下,第一場比賽返回 - 如果沒有找到匹配,則返回-1

我們去的時候寫到控制檯,我們檢查,如果currentHourdateTimes2最後一小時更高版本,如果是這樣,我們只是寫的dateTimes1當前指數和dateTimes2最後一個索引。否則,我們編寫當前索引dateTimes1以及dateTimes2小時匹配的索引。

0

使用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)。