c#在两个列表之间匹配,然后在两个列表之间添加时间

时间:2017-09-14 16:44:12

标签: c# list compare add

我有两个列表和一个类

commonlog.Add(new CommonLog { Break = breakTimeVar, Cart = cartVar,
    Length = lengthHours });

这是第一个

commonlog2.Add(new CommonLog { Break = breakTimeVar2, Cart = cartVar2,
    Length = lengthHours2 });

和一个像这样的清单2

0016 009130 00:01:30

我需要匹配的两条信息如下

列表1包含此

0016 0066486 00:00:30

0016 0050093 00:00:30

0016 0063791 00:00:30

列表2包含此

eslint-import-resolver-webpack

我需要匹配两个列表之间的第一个数字0016,然后将列表2中的最后一个数字00:00:30(3 x 30秒)相加,并将该总时间与列表1总时间进行比较,并且然后根据列表2中最后一个数字(时间)的总和是否等于列表1来做出决定

我将如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

您可以使用GroupBy对各个中断进行分组,然后循环查看聚合中断以查找匹配项。

总结个别休息时间Aggregate

我建议ALL使用TimeSpan代替string

数据

Length

逻辑

var totalBreaks = new List<CommonLog>
{
    new CommonLog
    {
        Break = "0016",
        Cart = "009130",
        Length = "00:01:30"
    }
};

var individualBreaks = new List<CommonLog>
{
    new CommonLog
    {
        Break = "0016",
        Cart = "0066486",
        Length = "00:00:30"
    },
    new CommonLog
    {
        Break = "0016",
        Cart = "0050093",
        Length = "00:00:30"
    },
    new CommonLog
    {
        Break = "0016",
        Cart = "0063791",
        Length = "00:00:30"
    }
};

答案 1 :(得分:1)

这是一个LINQ解决方案,它以类似(但更紧凑)的方式聚集你的List 2条目的Romoku答案:

var groupedLogs = commonlog2
    .GroupBy(c => c.Break, c => TimeSpan.Parse(c.Length))
    // group logs by Break, and get the TimeSpan representation of Length
    // for each entry of the group
    .ToDictionary(g => g.Key, g => g.Aggregate(TimeSpan.Zero, (s, c) => s + c));
    // create a dictionary and aggregate each log group into sums of TimeSpans

然后,您可以遍历commonlog的每个项目并比较结果:

foreach(var log in commonlog)
{
    TimeSpan sum;
    groupedLogs.TryGetValue(log.Break, out sum);
    if(sum == TimeSpan.Parse(log.Length))
    {
        // do something
    }
}

或者只使用commonlog(使用C#7功能)获得匹配条目的单行方式:

var matching = commonlog.Where(
    l => groupedLogs.TryGetValue(l.Break, out TimeSpan v)
         && TimeSpan.Parse(l.Length) == v);