某个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"
值和属性数组元素匹配,例如,值[0]始终是Properties [0]等的值。
我的目标是获得最新的" Heartbeat *"值。请注意,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值要查找之后循环继续。是否有更有效的方法来执行上述操作?
答案 0 :(得分:3)
虽然这不能解决性能问题,但我会像这样优化查询:
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();
编辑:Per @ dbc的评论,将.OrderByDescending(e => e).First();
更改为Max();
答案 1 :(得分:1)
我会在parallel for loop中找到包含“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更快。以下是对该主题的讨论:Which is Quicker: DateTime.TryParse or Regex