当前位置: 首页 > 知识库问答 >
问题:

合并类单一清单

柳胜
2023-03-14

我有一个类列表,其中包含事件名称、时间戳和持续时间(timespan)。有许多重复的事件名称。我想通过事件名称合并它们,并添加它们的持续时间,并保留最早的时间戳,除非事件具有特定的名称。即,删除重复的事件名称,为相似的事件名称添加持续时间,并保留偶数名称的最早时间戳。

有更好的方法吗?可能是用LINQ吗?

下面是我尝试过的,它似乎没有正确地合并(仍然有重复的但更少)

类:

public class eventRecords
{
    public DateTime TimeStamp { get; set; }
    public string Event { get; set; }
    public TimeSpan Duration { get; set; }
}  

我的尝试:

// allEventList is already sorted by TimeStamp, so my thinking is adding
// the first occurrence of an event to newList will keep the earliest
// TimeStamp in eventRecrods for that event
// Also - the duplicates are almost all consecutive in allEventList

var newList = new List<eventRecords>();
for (int ii = 0; ii < allEventList.Count; ii++ )
{
    newList.Add(allEventList[ii]);
    if((ii + 1) < allEventList.Count && allEventList[ii] != keyword)
    {
        if(allEventList[ii].Event == allEventList[ii+1].Event)
        {
            newList.Last().Duration = newList.Last().Duration+ allEventList[ii + 1].Duration; 
            ii = ii + 1;
        }

    }

}

例如,如果allEventList包含:

Event = "Action 1", TimeStamp = 08:00, Duration = TimeSpan.FromMinutes(1);
Event = "Action 1", TimeStamp = 09:00, Duration = TimeSpan.FromMinutes(1);
Event = "Action 1", TimeStamp = 10:00, Duration = TimeSpan.FromMinutes(1);
Event = "KeyWord", TimeStamp = 11:00, Duration = TimeSpan.FromMinutes(1);
Event = "Action 2", TimeStamp = 12:00, Duration = TimeSpan.FromMinutes(1);
Event = "Action 2", TimeStamp = 13:00, Duration = TimeSpan.FromMinutes(1);

newList应包含:

Event = "Action 1", TimeStamp = 08:00, Duration = TimeSpan.FromMinutes(3);
Event = "KeyWord", TimeStamp = 11:00, Duration = TimeSpan.FromMinutes(1);
Event = "Action 2", TimeStamp = 12:00, Duration = TimeSpan.FromMinutes(2);

共有1个答案

邬友樵
2023-03-14

这一点相当容易

我想按事件名称合并它们,并添加它们的持续时间,并保留最早的时间戳

allEventList.GroupBy(e => e.Event)
        .Select(g => new eventRecords{
             TimeStamp = g.Min(e => e.TimeStamp),
             Event = g.Key,
             Duration = new TimeSpan(g.Sum(e => e.Duration.Ticks))
         });

这是通过首先按event对列表进行分组来实现的,这给出了一个IEnumerable > 。然后使用select投影这些组,以生成一个新的EventRecords并根据请求聚合所需属性。

现场示例:http://rextester.com/mtvnh46675

作为对您的评论的答复,您可以在使用where对列表进行分组之前对其进行筛选。例如,如果您只需要事件名称长度大于5的事件(虚构的示例!)

allEventList.Where(e => e.Event.Length>5)
            .GroupBy(e => e.Event)
            .... etc
 类似资料:
  • 问题内容: 如何合并列表列表? 进入 如果我可以在合并列表之前在每个项目的开头和结尾添加一个值(例如html标签),那就更好了。 即,最终结果将是: 问题答案: 要串联列表,可以使用 要添加HTML标签,您可以使用列表推导。

  • 我有2个版本的Androidanifest.xml文件在我的项目,一个是主要的,另一个调试。 通过gradle添加了一个库之后,我突然看到: 错误:任务执行失败:应用程序:进程MobileDebugManiast。 清单合并失败:属性application@labelvalue=(XXXX Debug)来自Androidanifest.xml:36: 13-45也存在于[library_name]

  • 错误:任务“:app:ProcessDebugManifest”执行失败。 清单合并失败:来自AndroidManifest.xml:13:9-42的属性application@icon value=(@mipmap/appiconnew)也存在于[com.pnikosis:materialish-progress:1.0]AndroidManifest.xml:13:9-45 value=(@d

  • 我正在尝试使用Unity制作Android游戏。其中我使用了两个模块,它们将使用插件/Android特性1。sqlite.so2。simplenotification.aar它给了我错误: \temp\stagingarea\androidmanifest-main.xml:4:58-89错误:来自androidmanifest-main.xml:4:58-89的属性application@ico

  • 我似乎得到了这样的错误:

  • 问题内容: 我正在将当前项目的大型应用程序移至Android Studio和Gradle中。我目前陷入以下问题: 我尝试将以下属性添加到主文件: 这些属性定义都不起作用。我究竟做错了什么? 问题答案: 试试看: 将此添加到 将此添加到 基于此,它应该覆盖所有元素。“将低优先级声明替换为带注释的声明。”