需要帮助在一段时间内拉出最长和最短的时间

时间:2017-04-05 15:05:27

标签: c# wpf timespan

我有一个列表,打印一个我正在我的应用程序中为每个登录代理显示的时间跨度变量。当列表打印在我的数据网格上时,每个代理都有一列,每个代理列出一个时间跨度。我正试图拉出哪个代理当前具有最长的时间跨度并显示在另一个变量中我可以显示最长的可用时间而没有代理在手机上。我目前正在为我的列表使用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();

我知道很多这不是必需的,但是我发布了它以试图找出我想要实现的目标

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

3 个答案:

答案 0 :(得分:1)

我认为你认为这是一个蠢货。你有一个对象NewAgent。

将该对象中的属性定义为TimeInState,并将其设为只读:

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

当您基于NewAgent对象阅读时,这将始终为您提供当前状态。你填写AgentDateTimeChange(我假设这是他们所处状态的最后更新时间),然后TimeInState为你回来。如果你有一个NewAgent列表,那么你总是可以通过TimeInState来命令获得降序或升序列表:

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

答案 1 :(得分: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);

其中任何一个都应该有用。如果这回答了你的问题,请告诉我。

<强>更新

这将修复您的异常,但不会解决您的问题,因为您将在每次迭代时覆盖列表,最小值和最大值。 最简单的方法是将列表拉出循环并在其外部执行min / max。

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

答案 2 :(得分:0)

  

我试图拉出目前时间跨度最长的代理商

如果你重新定相,那么你需要按时间跨度最大到最小的第一个代理

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

其中TimeSpan是您计算此时间已经过了多长时间