我正在尝试计算列表中列中标记为“中断”的人数。
目前当我运行我的foreach循环(底部的那个)来计算列出的中断数时,它会抛出错误消息,无法将char类型转换为字符串。我知道我的NewAgent类不包含所有字符串值,但我只是尝试引用一个字符串。我需要一种方法来计算我的列表中出现休息的次数。 break将出现在newAgent.auxreason
下public List newAgentList;
List<NewAgent> newAgentList = new List<NewAgent>();
NewAgent newAgents = new ScoreBoardClientTest.NewAgent();
foreach (var item in e.CmsData.Agents)
{
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);
}
int breakCount = 0;
foreach(string s in newAgents.AuxReasons)
{
if (s != null && s.StartsWith("Break")) breakCount++;
}
答案 0 :(得分:1)
试试这个:
int breakCount = 0;
foreach(var agent in newAgentList)
{
if (!string.IsNullOrEmpty(agent.AuxReasons) && agent.AuxReasons.StartsWith("Break"))
breakCount++;
}
您还应该在每次迭代中创建新对象:
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;
newAgentList.Add(newAgents);
}
答案 1 :(得分:1)
首先,您需要将NewAgent newAgents = new ScoreBoardClientTest.NewAgent();
放在第一个foreach
循环中,因为现在您正在使用对同一对象的引用,如果您在一个地方更新此对象的任何属性,它将是更新了整个列表。
其次,您需要在第二个循环中使用newAgentList
而不是newAgents
(这就是为什么您会看到异常,因为您要在字符串内部使用字符而不是通过元素列表)。
这应该有效:
public List newAgentList;
List<NewAgent> newAgentList = new List<NewAgent>();
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;
newAgentList.Add(newAgents);
}
int breakCount = 0;
foreach(string s in newAgentList.AuxReasons)
{
if (!string.IsNullOrWhiteSpace(s.AuxReasons) && s.AuxReasons.StartsWith("Break")) breakCount++;
}
答案 2 :(得分:1)
好的,首先,我们在循环中做了一些不好的事情。
您宣布newAgents
并反复设置,因此它的值始终等于e.CmsData.Agents
中的最后一项。例如,如果您有一个列表,则列表中项目的AgName
为:
Bob
Michael
James
当循环完成时, newAgents
总是会有一个AgentName
的“James”,因为它被声明超出了循环的范围。通过将NewAgent
占位符的声明移动到循环范围内来解决此问题,如下所示:
List<NewAgent> newAgentList = new List<NewAgent>();
foreach (var item in e.CmsData.Agents)
{
NewAgent newAgents = new ScoreBoardClientTest.NewAgent();
// perform your data transforms
newAgentList.Add(newAgents);
}
这将使你实际上在列表中添加与你试图操作的数据相对应的元素,并且不需要在循环外存在该变量。
您是否正在尝试计算列表中每个代理的原因数,或者您是否尝试计算所有代理中的所有“中断”原因?我问的原因是,在迭代过程完成后,你在迭代器变量上进行了最后一次foreach
循环。
要计算所有元素的中断,请执行此操作而不是第二个循环:
int count = newAgentList.Sum(agent =>
agent.AuxReasons.Count(reasons =>
!string.IsNullOrEmpty(reasons) && reasons.StartsWith("Break")));
如果你想在操作它时计算迭代器,请在第一个循环中使用内部lambda函数,如下所示:
foreach (var item in e.CmsData.Agents)
{
// other logic from above
int count = newAgents.AuxReasons.Count(r =>
!string.IsNullOrEmpty(r) && r.StartsWith("Break");
// do something with count before loop ends
}
如果你执行后一个版本,你将需要在循环迭代完成之前对该计数做一些事情,否则它将会丢失。
如果所有这些都不清楚,这里是您的代码的完全修改版本:
List<NewAgent> newAgentList = new List<NewAgent>();
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;
newAgentList.Add(newAgents);
}
int breakCount = newAgentList.Count(agent =>
!string.IsNullOrEmpty(agent.AuxReasons) && agent.AuxReasons.StartsWith("Break"));
答案 3 :(得分:0)
第一步
NewAgent newAgents = new ScoreBoardClientTest.NewAgent();
进入第一个循环,以便newAgent在添加时成为新的 第二,第二个foreach在一个字符串上,所以它给你一个字符列表