2017-04-18 2 views
2

Ich habe eine Call-Center-Anwendung, die Anrufe in der Warteschlange in einer Reihe anderer Daten an unsere Analysten und Manager anzeigt. Ich versuche, die nächsten drei Personen in der Warteschlange anzuzeigen, um einen Anruf zu erhalten. Ich konnte den untenstehenden Code zusammenstellen und Max3 als Itemsource in einer Listbox referenzieren, aber es zeigt eigentlich nicht die Namen der Leute als nächstes an. Wenn Sie einen Haltepunkt auf Max3 hinzufügen, werden die drei nächsten Agenten angezeigt, aber auch alle Daten, die Zeit in der Warteschlange, die Nebenstellennummer und dergleichen. Ich muss wissen, wie man nur ihren Namen anzeigt.Brauchen Sie Hilfe, bestimmte Daten aus einer Liste zu ziehen

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

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") 
    { 
     availInItems.Add(Tuple.Create(newAgents.AgentName, timeSpanSince)); 
    } 

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

Tritt nach oben Code:

var availInAgents = newAgentList 
     .Where(ag => ag.AgentState == "AVAILIN") .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); 

max3.Reverse(); 

Dies ist, wo mein Problem vorhanden ist, zeigt es die Informationen in dem Screenshot unten. Ich brauche nur den Agentennamen und weiß nicht, wie ich nur auf diese Information zugreifen kann. Bitte helfen Sie damit.

nextInLine.itemsource = max3.ToString(); 

enter image description here

Antwort

1

Verwenden der .Select() Methode verwenden, um eine neue Art aus der Abfrage zu projizieren.

nextInLine.itemsource = max3?.Select(x => x?.AgentName).FirstOrDefault() ?? string.Empty; 

Es wird das erste Mittel in max3 nehmen und nur die Zeichenfolge AgentName, es zu itemsource Zuordnung abzurufen.

Die ? ist in diesem Fall der Nullfortpflanzungsoperator. Wenn max3 null ist, gibt es null zurück, bevor die .Select() ausgewertet wird, die in Verbindung mit dem Nullkoaleszenzoperator (??) den itemsource auf eine leere Zeichenfolge festlegen. Es wiederholt diesen Prozess, wenn ein Element in Ihrer max3-Liste null ist oder wenn AgentName selbst null ist.

+0

so das hat funktioniert. jede Chance, die Sie bei der Kompensation eines Nullwerts helfen können. Wenn ich die Select-Option verwende, wird manchmal ein Fehler ausgegeben und der Objektverweis wird nicht auf eine Instanz eines Objekts gesetzt. Deshalb habe ich das anfangs nicht gemacht. – firehotguitar88

+0

@ firehotguitar88 absolutley, bitte beachten Sie mein Update. –

+0

, so dass der Null-Referenzfehler behoben wurde und jetzt, dass es keinen Fehler gibt, merke ich, dass es die Agentennamen einen Buchstaben pro Zelle vertikal anzeigt. Angenommen, Sie haben eine einfache Lösung dafür. Wenn ich ein Textfeld anstelle eines Listenfelds verwende, werden die Namen korrekt angezeigt, es wird jedoch nur ein Name angezeigt. – firehotguitar88

1

Sie Select von Linq

var agentNamesFromMax3 = max3.Select(m => m.AgentName);