协助列表中的简单计数

时间:2017-03-31 14:53:33

标签: c# wpf

我正在尝试计算列表中列中标记为“中断”的人数。

目前当我运行我的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++;
}

4 个答案:

答案 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在一个字符串上,所以它给你一个字符列表