簡體   English   中英

檢查列表的最快方法 <T> 約會

[英]Fastest way to check a List<T> for a date

我有一台機器已經處理過的日期列表,但是沒有列出機器停機的日期。 我需要創建一個工作天數和不工作天數的列表。 我不確定執行此操作的最佳方法。 我首先增加了一個范圍的所有日期,然后通過每次遍歷整個列表來檢查日期是否在列表中。 我正在尋找一種更有效的日期查找方法。

class machineday
{
 datetime WorkingDay;
}

class machinedaycollection : List<machineday>
{
public List<TimeCatEvent> GetAllByCat(string cat)
{
  _CategoryCode = cat;


  List<machineday> li = this.FindAll(delegate(machinedaydummy) { return true; });
  li.Sort(sortDate);
  return li;
}

int sortDate(machinedayevent1, machinedayevent2)
{
  int returnValue = -1;
  if (event2.date < event1.date)
  {
    returnValue = 0;
  }
  else if (event2.date == event1.date)
  {
    //descending
    returnValue = event1.date.CompareTo(event2.date);
  }
  return returnValue;
}
}

對日期排序並並行迭代結果列表,以增加計數器。 每當計數器與當前列表元素不匹配時,您就會在列表中找到缺失的日期。

List<DateTime> days = ...;
days.Sort();
DateTime dt = days[0].Date;
for (int i = 0; i < days.Length; dt = dt.AddDays(1))
{
    if (dt == days[i].Date)
    {
        Console.WriteLine("Worked: {0}", dt);
        i++;
    }
    else
    {
        Console.WriteLine("Not Worked: {0}", dt);
    }
}

(這假定列表中沒有重復的日期。)

建立一個有效日期列表,並使用LINQ的Enumerable.Except擴展方法從中減去您的機器工作日集合。 像這樣:

IEnumerable<DateTime> dates = get_candidate_dates();
var holidays = dates.Except(machinedays.Select(m => m.WorkingDay));

get_candidate_dates()方法甚至可以是一個迭代器,該迭代器可以動態生成某個范圍內的所有日期,而不是所有日期的預存儲列表。

Enumerable的方法相當智能,通常會在性能方面做得不錯,但是如果您想要最快的算法,則取決於您打算如何使用結果。

抱歉,伙計,但我不太喜歡您的解決方案。 我認為您應該使用日期創建一個HashTable。 您可以只在工作日進行一次插值。

然后,您對整天的日期進行插值,並針對哈希表中查詢的每一天(是否存在日期),使用

myHashTable.ContainsKey(day); // this is efficient

簡單,優雅,快速。

我認為您的解決方案使用指數時間,這是線性的或對數的(實際上是一件好事)。

假設列表已排序並且機器大部分時間都在“運行”,則可以通過按月對日期進行分組並跳過其中的日期來避免遍歷所有日期。 這樣的事情(您需要清理):

int chunksize = 60; // adjust depending on data
machineday currentDay = myMachinedaycollection[0];

for (int i = 0; i < myMachinedaycollection.Count; i += chunksize)  
{  
    if (currentDay.WorkingDay.AddDays(chunksize) != myMachinedaycollection[i + chunksize].WorkingDay)  
    {
        // write code to iterate through current chunk and get all the non-working days  
    }
    currentDay = myMachinedaycollection[i + chunksize];  
}  

我懷疑您想要一份工作日列表,而不是工作日。

您的問題標題表明您想知道系統是否在特定日期啟動。 計算正常運行時間百分比似乎也很合理。 這些都不要求建立該間隔中所有時刻的列表。

排序服務時間。 對於第一個問題,請在BinarySearch中輸入您關心的日期,並檢查前面的條目是系統處於脫機維護狀態還是重新投入使用。 要獲得正常運行時間百分比,請成對(關閉維護,恢復服務),使用減法找到維護的持續時間,然后累加。 然后使用減法求出總間隔的長度。

如果您的問題實際上並非意味着您要跟蹤維護間隔(或等效的使用間隔),則可以忽略此答案。

暫無
暫無

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

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