![](/img/trans.png)
[英]Some clarification about how a controller handle an HTTP Request in C#?
[英]Some clarification about arrays for a project
或者有人解释如何执行此操作或指导我获取一些资源。 这是任务信息:
dataCaptured:integer 数组 - 该字段将存储一组有限的最近捕获的测量值的历史记录。 一旦阵列已满,class 应该开始覆盖最旧的元素,同时继续记录最新的捕获。 (您可能需要一些辅助字段/变量到 go)。
mostRecentMeasure: integer - 该字段将存储最近捕获的测量值以方便显示。
获取原始数据。 返回 dataCapture 数组的内容。 哪个元素是您历史上最古老的元素? 您需要操纵这些值吗? 它们将如何呈现给用户?
添加一个按钮以显示测量历史记录 (GetRawData)。 您将在哪里/如何显示此列表? 你让 GetRawData() 返回了什么? 列表是否从收集到的最早值开始? 当您的历史数组填满并且旧值被覆盖时会发生什么? 当您的历史记录尚未填满时会发生什么? “0”算作实际的历史条目吗? 您的历史记录是否显示收集数据的单位?
那么,我想将整个数组传递给文本框吗? 我怎么做? Atm,我确实已经启动并运行了设备,我想我已经为阵列准备了一个文本框。 有人可以指导我阅读一些关于将这些信息传递到哪里的文章吗? 谢谢你的帮助。
目前我有:
private double[] dataCaptured;
public double[] GetRawData()
{
return dataCaptured;
}
很少:(
我不会为你做功课,所以这不是真正的答案; 它更像是一个教程。
首先,分配给您的问题很常见。 考虑某种化学过程。 您构建了一个定期测量系统某些属性(例如温度)的系统。 根据过程的性质,您可以每 200 毫秒、每 2 秒、每 2 分钟等测量一次。 但是,你将永远这样做。 您希望将数据保留一段时间,但不是永远保留 - memory 这些天很便宜,但没那么便宜。
所以您决定保留最后 N 个测量值。 您可以将其保存在 N 元素数组中。 当您获得第一个测量值时,将其放在数组的 0 元素中,第二个放在 1 元素中,依此类推。 当你到达第 N 个测量值时,你将它放在最后一个元素中。 但是,对于第 (N+1) 个元素,您遇到了问题。 解决方案是将它放在数组的 0 元素中。 下一个进入数组的 1 元素,依此类推。
在这一点上,你需要一些簿记。 您需要跟踪放置最新元素的位置。 您还需要跟踪最旧元素的位置。 您还需要一种方法来以某种软时间顺序获取所有测量值。
这是一个循环缓冲区。 它是循环的原因是因为你数 0, 1, 2...N-1, N, 0, 1, 2 等等,一直循环下去。
当您第一次开始用测量值填充缓冲区时,最早的在 element-0 中,最新的在您放置最后一个测量值的位置。 它会一直这样,直到你填满缓冲区。 一旦你这样做了,那么最旧的就不再是 0,它在逻辑上位于最近的元素之后的元素(它是下一个元素,或者,如果你在缓冲区的末尾,则在 0 位置)。
您可以跟踪数组/缓冲区中最旧和最新的索引。 一种更简单的方法是只跟踪您是否处于初始尚未填充缓冲区阶段(布尔值)和最新索引。 最旧的是索引 0(如果您尚未填充缓冲区)或逻辑上位于最新索引之后的索引。 这样记账会容易一些。
为此,您需要一种方法来查找缓冲区中的下一个逻辑索引(如果您已到达缓冲区末尾,则为index+1或0 )。 您还需要一种获取所有数据的方法(从逻辑上当前条目之后的索引开始,然后获取下 N 个逻辑条目)。
顺便说一下,我会使用float
而不是double
来跟踪我的测量结果。 一般来说,测量本身有足够的误差, double
精度提供的额外精度是没有用的。 通过将数据大小减半,您可以使缓冲区的长度增加一倍(顺便说一句,这是测量和控制系统中的一个考虑因素)。
对于您的测量源,我最初会使用一个从1.0f
开始的数字生成器,并且每个周期只增加1.0f
。 这将使调试变得更加简单。
private float tempValue = 1.0f;
private float GetNextValue()
{
tempValue += 1.0f;
return tempValue;
}
一旦真正做到这一点,您可能需要随机数,例如:
private readonly Random _random = new Random();
private const float MinValue = 4.0f;
private const float MaxValue = 20.0f;
private float GetNextValue()
{
var nextRandom = _random.NextDouble();
var nextValue = (float) ((MaxValue - MinValue) * nextRandom + MinValue);
return nextValue;
}
顺便说一下,选择 4.0 和 20.0 是有意为之的——谷歌搜索“4 20 测量”。
如果你想花哨一点,生成一个随机数 stream 并通过平滑滤波器运行它(但这会变得更复杂)。
您询问了如何将所有值放入一个文本框中。 这应该可以解决问题:
// concatenate a collection of float values (rendered with one decimal point)
// into a string (with some spaces separating the values)
private string FormatValuesAsString(IEnumerable<float> values)
{
var buffer = new StringBuilder();
foreach (var val in values)
{
buffer.Append($"{val:F1} ");
}
return buffer.ToString();
}
IEnumerable<float>
表示float
值的集合。 浮点数组实现了该接口,几乎所有其他浮点集合也是如此(这意味着您可以为该参数放入一个数组( FormatValuesAsString(myArray)
)。您还可以创建一个动态生成值的 function(查找yield return
) FormatValuesAsString
function 将返回一个字符串,您可以将其推入文本框。如果您在每个计算周期都这样做,您将看到您的值在文本框中移动。
通过这个练习,您将非常了解调试器。 在第一次、两次、三次或……尝试中很难做到这一点(您将了解为什么程序员会诅咒一个错误)。 不要放弃。 这是一个很好的任务。
最后,如果您感到困惑,可以将问题作为对此答案的评论发表(在合理范围内)。 标记我(以确保我看到它们)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.