我有一个列表,它会拉出时间跨度并选择并显示列表中的最大时间跨度。我需要找出一种方法来显示也匹配该时间跨度的名称。不完全确定从哪里开始。任何人都能让我开始。我在下面的一些代码。
代码:您可以看到我从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);
答案 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();