我有一个要通过查找字符串值匹配来遍历的数据列表,该列表如下所示:

enter image description here

我希望输出为:

enter image description here

为了实现这一点,我try 使用Linq,但没有得到所需的输出.

List<WorkItemStateTime> workItems = new List<WorkItemStateTime>();               

int totalCount = 0; int currentId = 1;
string currentState;

totalCount = revisionData.Count;
do
{
    WorkItemStateTime workItemStateTime = new WorkItemStateTime();
    var currRow = revisionData.Where(x => x.rev == currentId).FirstOrDefault();                    
    currentState = currRow.fields.SystemState;
    workItemStateTime.State = currentState;
    workItemStateTime.StartTime = currRow.fields.SystemChangedDate;

    var nextRow = revisionData.SkipWhile(x => x.fields.SystemState != currentState).Skip(1).FirstOrDefault();
    currentId = nextRow.rev;
    workItemStateTime.EndTime = nextRow.fields.SystemChangedDate;
    workItems.Add(workItemStateTime);

} while ((currentId - 1) < totalCount);

推荐答案

如果你需要列表中的项目之间的交互,LINQ真的很糟糕.在您的情况下,您需要具有不同状态的下一项的开始时间.我建议您使用classic 的循环:

for(int i = 0; i < data.Count; i++)
        {
            for(int j = i+1; j < data.Count; j++)
            {
                if(data[i].State != data[j].State)
                {
                    result.Add(new Item { State = data[i].State, Start = data[i].Start, End = data[j].Start });
                    i = j;
                    continue;
                }
            }
            result.Add(new Item { State = data[i].State, Start = data[i].Start, End = DateTime.Now });
        }

Out循环遍历您的完整输入.内部循环一直运行,直到它找到具有不同状态的项.如果找到该项目,我们将在结果列表中添加一个新项目,其中第一个项目的开始时间和在内部循环中找到的项目的结束时间.然后,通过将外循环的索引设置为内循环的索引来跳过所有具有相同状态的项.如果没有找到项目,我们显然是在列表的末尾,我们向结果列表添加一个项目,其结束时间为当前时间.

在线演示:https://dotnetfiddle.net/jfgvuj

Csharp相关问答推荐

C#中的包版本控制

如何从顶部提取发票号作为单词发票后的第一个匹配

为什么我不能更改尚未设置的模拟对象属性的值?

有没有一种方法可以在包含混合文本的标签中嵌入超链接?

碰撞检测与盒碰撞器,其isTrigger on问题

在C#中,DirectoryEntry返回空AuditRules集合,即使审计规则确实存在

Azure DEVOPS找不到定制的Nuget包

如何使用自定义负载均衡器管理Ocelot负载均衡器中的多线程和批读取

try 使用C#ASP.NET收集WMI信息时访问被拒绝,但在PowerShell中工作

对于PowerShell中的ConvertTo-SecureString方法,Microsoft如何将初始化向量添加到AES加密中的安全字符串?

如何防止Visual Studio断点以红色突出显示到整行?

在Windows Plesk上发布ASP.NET Core 7 Web API-错误:无法加载文件或程序集';Microsoft.Data.SqlClient';

当我try 在与XAMP的MySQL服务器连接的ASP.NET核心应用程序中添加迁移时出现错误

如何使用ODP.NET C#设置Oracle会话时间长度限制

C#命名管道-编码错误?

我应该为C#12中的主构造函数参数创建私有属性吗?

DropDownListFor未显示选定值

C#定时器回调对象上下文?

如何在.NET8中使用Blazor Web App(WebAssembly)托管服务器端控制器?

ASP.NET核心中的验证错误-该字段为必填字段