需要弄清楚如何从列表中提取名称和时间跨度

时间:2017-04-14 14:29:00

标签: c# wpf

我有一个列表,它会拉出时间跨度并选择并显示列表中的最大时间跨度。我需要找出一种方法来显示也匹配该时间跨度的名称。不完全确定从哪里开始。任何人都能让我开始。我在下面的一些代码。

代码:您可以看到我从item中创建了一个时间表列表,其中workmodedirectiondescription = AVAIL-IN。我还需要AgName = AVAIL-IN =然后匹配具有最大时间Listoftimespans.max的代理并显示具有最大时间的代理的名称。我希望这是有道理的。我遇到的最大问题是我可以创建一个单独的agname列表,但后来不知道如何匹配代理的时间以显示具有最长时间的名称。我无法在列表listoftimespans中添加agname,因为agname的类型为string而不是timespan。

  var listofTimeSpans = new List<TimeSpan>();

      List<NewAgent> newAgentList = new List<NewAgent>();                  

     foreach (var item in e.CmsData.Agents)
     {
         NewAgent newAgents = new 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;

         newAgentList.Add(newAgents);

         if (item.WorkModeDirectionDescription == "AVAIL-IN")
         {
             listofTimeSpans.Add(timeSpanSince);
         }
         var comparetimeandname = new tuple<string, TimeSpan>(item.Agname, listoftimespans.max());

         max = comparetimeandname.item2;
         maxname = comparetimeandname.item1.

     }

更新:发生在上述代码

之后
  var availInAgents = newAgentList.Where(ag => ag.AgentState == "AVAIL-IN").ToList();

  availInAgents.Sort((t1, t2)=>t1.AgentDateTimeStateChange.CompareTo(t2.AgentDateTimeStateChange));

                    var minTimeSpanAgent = availInAgents.FirstOrDefault();
                    var maxTimeSpanAgent = availInAgents.LastOrDefault();

                    var min3 = availInAgents.Take(3).ToList();
                    var max3 = availInAgents.Reverse<NewAgent>().Take(3).ToList();

NextInLine.Text = string.Join(Environment.NewLine, min3);

编辑:截图 enter image description here

2 个答案:

答案 0 :(得分:0)

我认为LINQ可以帮助你。

例如,如果您需要具有最大TimeSpan的代理:

var maxAgent = newAgentList.Max(agnet => agnet.AgentDateTimeStateChange);
Console.writeLine(maxAgent.AgentName);

答案 1 :(得分:0)

因此,正如在评论中所讨论的那样,您将收集代表名称及其时间跨度的元组列表。顺便说一句,我不会在循环中这样做;循环后我会这样做:

var availInItems = 
    newAgentList
        .Where(ag => ag.WorkModeDirectionDescription == "AVAIL-IN")
        .Select(ag => 
            new Tuple<String, TimeSpan>(ag.AgentName, ag.AgentDateTimeStateChange))
        .ToList();

要获取最小和最大时间跨度项,只需按每个项的TimeSpan值对列表进行排序,然后抓取第一个和最后一个项目。我使用的是FirstOrDefault()LastOrDefault()而不是First()Last(),因为它们在空列表中返回null而不是抛出异常。这样,我们更优雅地处理列表恰好为空的情况。

List<Tuple<String, TimeSpan>> availInItems = new List<Tuple<string, TimeSpan>>();

//  ... populate availInItems in loop ...

availInItems.Sort((t1, t2) => t1.Item2.CompareTo(t2.Item2));

var minTimeSpanTuple = availInItems.FirstOrDefault();
var maxTimeSpanTuple = availInItems.LastOrDefault();

最低三,最高三:

var min3 = availInItems.Take(3).ToList();
//  There's another overload of Reverse, without the type argument, which 
//  is a meber of List<T>; it reorders the list in place and returns void. 
//  You need this one.
var max3 = availInItems.Reverse<Tuple<String, TimeSpan>>().Take(3).ToList();

如果列表中的项目少于三个,则可以。你会得到它拥有的任何东西。

然而

我们在元组中放入的两条信息都在NewAgent中。为什么要涉及元组?没必要。我只是这样做:

var availInAgents = 
    newAgentList
        .Where(ag => ag.WorkModeDirectionDescription == "AVAIL-IN")
        .ToList();

availInAgents.Sort((t1, t2) => 
    t1.AgentDateTimeStateChange.CompareTo(t2.AgentDateTimeStateChange));

var minTimeSpanAgent = availInAgents.FirstOrDefault();
var maxTimeSpanAgent = availInAgents.LastOrDefault();

var min3 = availInAgents.Take(3).ToList();
var max3 = availInAgents.Skip(availInAgents.Count - 3).ToList();

max3.Reverse();