在两个数组之间匹配属性/值数据

本文关键字:属性 数据 之间 数组 两个 | 更新日期: 2023-09-27 18:11:46

某个API调用返回两个数组。一个数组包含属性名,例如

Properties[0] = "Heartbeat"
Properties[1] = "Heartbeat 2"
Properties[2] = "Some Other discovery method"

另一个数组包含Properties数组的值,例如

Values[0] = "22/01/2007"
Values[1] = "23/02/2007"
Values[2] = "5/06/2008"

values和properties数组元素匹配,例如values[0]总是properties[0]的值,等等

我的目标是获得最近的"心跳*"值。请注意,Heartbeat属性和值并不总是在数组的元素1和2中,所以我需要搜索它们。

代码如下:

static DateTime GetLatestHeartBeat(string[] Properties, string[] Values)
{
    DateTime latestDateTime = new DateTime();
    for(int i = 0; i < Properties.Length; i++)
    {
        if(Properties[i].Contains("Heart"))
        {
            DateTime currentDateTime;
            DateTime.TryParse(Values[i],out currentDateTime);
            if (currentDateTime > LatestDateTime)
                latestDateTime = currentDateTime;
        }
     }
     return latestDateTime
}

上面的代码给了我想要的结果,唯一的问题是在没有更多的Heartbeat值可以找到之后循环继续。是否有更有效的方法来执行上述任务?

在两个数组之间匹配属性/值数据

虽然这不能解决性能问题,但我会这样优化查询:

var latestDateTime = Properties.Select((p, index) => 
                                     new {p, v = DateTime.Parse(Values[index])})
                                 .Where(e => e.p.Contains("Heart"))
                                 .OrderByDescending(e => e.v).First();

也许将解析移到where子句之后可以限制它强制转换的次数。

var latestDateTime = Properties.Select((p, index) => 
                                 new {p, v = Values[index]})
                               .Where(e => e.p.Contains("Heart"))
                               .Select(e => DateTime.Parse(e.v))
                               .Max();

编辑:根据@dbc的评论,将.OrderByDescending(e => e).First();更改为Max();

我会在并行for循环中找到包含"Heart"(或其他关键字)的索引以加快速度。然后遍历这些索引以找到最新的索引。

    static DateTime GetLatestHeartBeat(string[] props, string[] vals)
    {
        ConcurrentBag<int> heartIndxs = new ConcurrentBag<int>();
        // find the indices of "Heart" in parallel
        Parallel.For(0, props.Length,
            index =>
            {
                if (props[index].Contains("Heart"))
                {
                    heartIndxs.Add(index);
                }
            });
        // loop over each heart index to find the latest one
        DateTime latestDateTime = new DateTime();
        foreach (int i in heartIndxs)
        {
            DateTime currentDateTime;
            if (DateTime.TryParse(vals[i], out currentDateTime) && (currentDateTime > latestDateTime))
                latestDateTime = currentDateTime;
        }
        return latestDateTime;
    }

如果使用DateTime。TryParse真的太慢了,你可以使用RegEx来解析日期字符串,然后自己进行比较。老实说,我不确定这是否比只使用DateTime.TryParse更快。下面是关于这个话题的讨论:哪个更快:日期时间。