CalcolaRPM()
如果您想在调用它之间计时,您将需要在方法外部放置一个秒表。
最简单的做法是将其添加为类中的私有字段。
另一个问题是,当giriRicevuti
不是“1”时,您需要返回最后一个已知的 RPM——我们也可以通过将最后一个已知的 RPM 保存在私有字段中来解决这个问题。
还有一个问题是,第一次计算 RPM 时,它不可能准确,因为没有之前的时间来比较它。我们将通过返回来解决这个问题,-1
直到我们有正确的报告时间。
接下来,您将经过的 RPM 计算为整数计算。现在想象一下,如果事情稍微有点不对劲,那么经过的时间总是 999 毫秒。只有一毫秒,但您计算的 RPM = 999/1000 将导致零。
您有多种选择,但最有可能的是:
- 而是返回一个双精度值。
- 将该值四舍五入到最接近的 RPM。
我去了四舍五入。RPM 计算不正确,所以我同时更正:
lastRPM = (int) Math.Round(60000.0/((int) stopWatch.ElapsedMilliseconds));
总而言之,这是一个可编译的测试程序(控制台应用程序):
using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Threading;
namespace Demo
{
class Rpm
{
private Stopwatch stopWatch = new Stopwatch();
private int lastRPM = -1;
// RPM will be -1 until we have received two "1"s
public int CalcolaRPM(string giriRicevuti)
{
if (giriRicevuti == "1")
{
if (stopWatch.IsRunning)
lastRPM = (int) Math.Round(60000.0/((int) stopWatch.ElapsedMilliseconds));
stopWatch.Restart();
}
return lastRPM;
}
}
class Program
{
void run()
{
test(900);
test(1000);
test(1100);
test(500);
test(200);
}
void test(int interval)
{
Rpm rpm = new Rpm();
for (int i = 0; i < 10; ++i)
{
Thread.Sleep(interval);
rpm.CalcolaRPM("0");
rpm.CalcolaRPM("1").Print();
rpm.CalcolaRPM("2");
}
}
static void Main()
{
new Program().run();
}
}
static class DemoUtil
{
public static void Print(this object self)
{
Console.WriteLine(self);
}
public static void Print(this string self)
{
Console.WriteLine(self);
}
public static void Print<T>(this IEnumerable<T> self)
{
foreach (var item in self) Console.WriteLine(item);
}
}
}