【问题标题】:How can i do this calculation in c#我如何在 C# 中进行此计算
【发布时间】:2020-07-17 16:18:10
【问题描述】:

好的,现在我有一个 TasksGroup 对象,它有一个 Taches 列表。此 Taches 列表包含许多具有计算所需的属性 TaskDBATaskDuration 的任务。

但我被TaskDBA 指数部分卡住了,不知道如何继续。感谢您的帮助!

公式:

10 x Log [ SUM( TaskDuration x 10^(0.1 x TaskDBA) +...+ TaskDuration2 x 10^(0.1 x TaskDBA2)+....]

TaskDuration 是一个字符串,TaskDBA 是一个整数

持续时间最初是从格式为 HH:MM:SS 的输入框中获取的,所以我在这里所做的是我有方法 GetDuration 将持续时间转换为 TimeSpan 对象。

private TimeSpan GetDuration(string duration)
{
    var value = duration.Split(':').Select(int.Parse).ToArray();
    var datetime = new TimeSpan(value[0], value[1], value[2]);
    return datetime;
}

我卡在的计算方法是

10^(0.1 * TaskDBA)

Taches = 任务列表

public double CalculateExposition(TasksGroup group)
{
    // i thought this could be usefull
    var GetDBA = group.Taches.Select(x => (double)(x.TaskDBA));

    //i first use x.TotalHours because i need my TimeSpan to be converted to decimal

    var sum = group.Taches.Select(x => GetDuration(x.TaskDuration)).Sum(x => x.TotalHours * 
    Math.Pow(10,GetDBA.));

    return sum;
}

【问题讨论】:

  • 您可以将GetDuration 替换为对TimeSpan.ParseExact 的调用。对于内部Sum,使用与x 不同的东西,这样就不会与Select 的x 混淆。无需将TaskDBA 转换为加倍。对于0.1 x TaskDBA,我只会做TaskDBA / 10.0

标签: c# linq parsing math timespan


【解决方案1】:

我认为您应该能够像这样简化您的方法:

public double CalculateExposition(TasksGroup group)
{
    return 10 * Math.Log(group.Taches.Sum(x => TimeSpan.Parse(x.TaskDuration).TotalHours * Math.Pow(10, x.TaskDBA / 10.0)));
}

你不需要做任何Select,直接做你需要的sum即可。如您所见,对于每个Tach,您需要做的就是:

TimeSpan.Parse(x.TaskDuration).TotalHours * Math.Pow(10, x.TaskDBA / 10.0)

** 更新**

由于输入字符串中的小时数可能大于 23 且 TimeSpan.ParseParseExact 不支持,因此您需要这样做:

private TimeSpan GetDuration(string duration)
{
    var parts = duration.Split(':').Select(x => int.Parse(x)).ToList();
    return new TimeSpan(parts[0], parts[1], parts[2]);
}

public double CalculateExposition(TasksGroup group)
{
    return 10 * Math.Log(group.Taches.Sum(x =>
        GetDuration(x.TaskDuration).TotalHours * Math.Pow(10, x.TaskDBA / 10.0)
    ));
}

【讨论】:

  • idk 如果你还在这里,但也许应该可以发光假设用户输入 03:03:03,不会有问题,但是如果他输入 33:33:33 我得到:未处理的异常:System.OverflowException:无法解析 TimeSpan,因为至少有一个数字组件超出范围或包含太多数字。知道为什么吗?谢谢!
  • 哦,我猜你不能超过 24 小时
  • 是的,你可以,但是你需要使用不同的方法。让我更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 2015-04-01
  • 1970-01-01
相关资源
最近更新 更多