2017-04-05 41 views
0

我有一個列表,打印出當前顯示在我的應用程序中的每個登錄代理的時間跨度變量。列表打印在我的數據網格上時,每個代理程序都有一個列,每個代理程序都有一個時間範圍。我試圖拉取當前具有最長時間間隔的代理,並將其顯示在另一個變量中,以顯示沒有代理在電話上的最長可用時間。我目前正在使用一個foreach循環作爲我的列表,並試圖從timepan變量中提取時間,坦率地說,我想我不理解這個列表是如何工作的(這裏的業餘程序員)。下面列出我展示了什麼,我只用於時間跨度數學,然後整個foreach循環下面。需要幫助在一個時間範圍內拉最長和最短的時間

var timeSpanSince = DateTime.Now - item.DateTimeUpdated; 

newAgents.AgentDateTimeStateChange = timeSpanSince; 

var listofTimeSpans = new List<TimeSpan>(AgentDateTimeStateChange); 

var min = listofTimeSpans.Min(); 
var max = listofTimeSpans.Max(); 

我知道是不是需要很多這一點,但我張貼,試圖開發什麼,我試圖accomplishe

foreach (var item in e.CmsData.Agents) 
{ 
    NewAgent newAgents = new ScoreBoardClientTest.NewAgent(); 
    newAgents.AgentName = item.AgName; 
    newAgents.AgentExtension = item.Extension; 
    newAgents.AgentDateTimeChange = ConvertedDateTimeUpdated; 
    newAgents.AuxReasons = item.AuxReasonDescription; 
    newAgents.LoginIdentifier = item.LoginId; 
    newAgents.AgentState = item.WorkModeDirectionDescription; 

    var timeSpanSince = DateTime.Now - item.DateTimeUpdated; 
    newAgents.AgentDateTimeStateChange = timeSpanSince; 

    var listofTimeSpans = new List<TimeSpan>(AgentDateTimeStateChange); 
    var min = listofTimeSpans.Min(); 
    var max = listofTimeSpans.Max(); 
    int breakCount = 0; 
    foreach (var agent in newAgentList) 
    {        
     if (!string.IsNullOrEmpty(agent.AuxReasons) && agent.AuxReasons.StartsWith("Break")) 
      breakCount++; 
     } 

     int lunchCount = 0; 
     foreach (var agent in newAgentList) 
     {        
      if (!string.IsNullOrEmpty(agent.AuxReasons) && agent.AuxReasons.StartsWith("Lunch")) 
       lunchCount++; 
      } 
      newAgentList.Add(newAgents); 
      if (breakCount > 2) 
      { 
       Dispatcher.BeginInvoke(DispatcherPriority.Normal, Action)(() => 
       { 
        inBreakData.Foreground = new SolidColorBrush(Colors.Yellow); 
        inBreakData.Text = breakCount.ToString(); 
       })); 
      }else if (breakCount > 3) 
      { 
       Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() => 
       { 
        inBreakData.Foreground = new SolidColorBrush(Colors.Red); 
        inBreakData.Text = breakCount.ToString(); 
       })); 
      } 
      else 
      { 
       Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() => 
       { 
        inBreakData.Foreground = new SolidColorBrush(Colors.Green); 
        inBreakData.Text = breakCount.ToString(); 
       })); 
      } 

      Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() => { inLunchData.Text = lunchCount.ToString(); })); 
     }  
+0

這樣的問題是什麼?附:你的'否則,如果(breakCount> 3)'是由於'如果(breakCount> 2)'可達 - 每一個值,該值大於3總是大於2,例如4比2更大,所以它甚至不會去to> 3語句 – artgdev

+0

謝謝。我以爲我已經糾正了,但猜測我沒有。無論哪種方式。我正在嘗試爲agentDateTimeStateChange中的所有代理顯示最大時間,並將該時間打印到新的TimeSpan變量,以便只顯示最長時間。當我做新的列表(AgentDateTimeStateChange)它說,它不會在目前的情況下存在,即使其直接上面我用它在代碼的其他地區的。我假設我正在創建這個錯誤列表。我也假設這是實現這一目標的最好方法。 – mcavanaugh418

回答

1

從我的意見得到,您有問題var listofTimeSpans = new List<TimeSpan>(AgentDateTimeStateChange);

你不有一個名爲AgentDateTimeStateChange的變量,您擁有該名稱的NewAgent類的財產。所以,你必須在這裏

var listofTimeSpans = new List<TimeSpan>(); 
listofTimeSpans.Add(newAgents.AgentDateTimeStateChange); 

var listofTimeSpans = new List<TimeSpan>(); 
listofTimeSpans.Add(timeSpanSince); 

兩個選擇要麼他們應該工作。讓我知道這是否回答你的問題。

UPDATE

這將解決您的異常,但不會解決你的問題,因爲你要超越你的列表,分鐘,並在每次迭代最大值。 最簡單的方法是將列表從循環中拉出,並在其外面執行min/max。

var listofTimeSpans = new List<TimeSpan>(); 
foreach(...) { 
    ... 
    listofTimeSpans.Add(timeSpanSince); 
    ... 
} 
var min = listofTimeSpans.Min(); 
var max = listofTimeSpans.Max(); 
+0

當做newAgents.AgentDateTimeStateChange這是我也試過它試圖將system.timespan轉換爲int和抱怨。 – mcavanaugh418

+0

是的,我的錯誤,你不能作爲參數傳遞給List構造函數。你必須初始化,然後使用listofTimeSpans.Add()就像我的更新 – artgdev

+0

這結束了顯示我所需要的數據,我只需要構建適當的if語句,以顯示我想要的數據時,我現在想。感謝您的幫助。 – mcavanaugh418

1

我認爲你是在想它的想法一個skosh。你有一個對象NewAgent。

定義該對象,就像這樣TimeInState屬性,使其只讀:

public TimeSpan TimeInState {get { return DateTime.Now - AgentDateTimeChange; } } 

這總是會得到你的當前時間的狀態,當你閱讀基礎上,NewAgent對象。你填寫AgentDateTimeChange(我假設這是他們所處狀態的最後一次更新時間),然後TimeInState回來。如果你有NewAgents的列表,那麼你可以通過TimeInState總是爲了得到升序或降序列表:

(List<NewAgent>).OrderByDescending(o => o.TimeInstate); 
+0

我認爲這會給我一個所有時間的列表,但我只想打印列表中的最大時間。我假設我可以繼續使用我已經在我的問題中提供的代碼來做到這一點? – mcavanaugh418

+0

也。 AgentDateTimeChange的類型是時間跨度和定義的屬性時,像你這樣它上面抱怨,因爲它不能轉換的System.DateTime到system.timespan – mcavanaugh418

+0

由遞減的順序,會得到最大的時間來獲得最大的你: (名單).OrderByDescending(o => o.TimeInstate)[0] .TimeInState; –

0

我想拉哪個代理目前最長的時間跨度

如果你重聚的是,你要在第一劑時的時間跨度下令從最大到最小

var agent = agents.OrderByDescending(a=>a.TimeSpan).FirstOrDefault(); 

其中TimeSpan是您計算此ti的時間長度meSpan一直

相關問題