gpt4 book ai didi

c# - 将类解释为文本

转载 作者:行者123 更新时间:2023-11-30 18:15:53 25 4
gpt4 key购买 nike

(为长问题道歉)

你好,我们有一项服务正在运行,每 15 分钟监控一次我们的队列,并将结果输出到许多东西(公司 IM、日志、表存储)。我正在寻找一种将数据转换为“智能”文本以输出到我们的 IM 的好方法。

该服务监控 3 件事(警报),结果对象如下所示

    public class ServiceMonitorResult 
{
public string Name
public int Count
public int Age
public int Delta
// our 3 alerts
public IAlert CountAlert // can be null
public IAlert DeltaAlert // can be null
public IAlert AgeAlert // can be null


}

public interface IAlert
{
AlertStatus Status// enum : New - Continuing - Ended
...
public string MessageText // usually like $"{ServiceName (very long)} {alert status} breached {Alert} with value X at {DateTime.Now}. Started At {startedAt}"
}

当此结果通过我们公司的 IM 发送时,结果有时会非常冗长。我们有超过 200 项服务,如果我们平均有 10% 的违规,那就是 20 条消息/15 分钟!!

您可以想象在多次失败时您会收到多少消息。

我已经从 IAlert 中删除了 MessageText,以便有另一个类负责根据警报状态构建消息。原因是这种监控的结果需要以不同的方式显示 - 例如 在 IM 中它需要简洁明了;它在表存储中并不重要,因为它用于分析并且不被人类读取。

鉴于:

  1. 这些警报可以是 null ,如果不是,它们的状态可以是 New、Continuing 或 ended。
  2. 我有兴趣显示至少有一个状态为
  3. 的警报的服务
  4. 我有兴趣显示至少有一个状态为已结束
  5. 的警报的服务

我正在尝试做的是使用某种设计模式/算法,而不是使用嵌套的 if else 语句,否则这些语句将变成意大利面条并且维护/理解效率低下。我看过解释器模式,但看起来它在这里不起作用。有什么想法吗?


监控输入示例

服务名称:CountAlertStatus/AgeAlertSatus/DeltaAlertStatus

  1. service100:N/-/E
  2. 服务 101:N/N/C
  3. 服务 102:-/-/-
  4. Service103:C/C/C
  5. Service104:C/E/N
  6. 服务 105:N/N/N
  7. 服务106:E/E/E

(N:new , C: continuing:, E: ended, -:null alert)

期望的输出

  • service100:计数 (X) 被破坏并且 Delta 在 {Now} 不再被破坏
  • service101:违反计数 (X) 和年龄 (Y)。 {Now} Delta 仍未突破 (Z)
  • Service104:Delta (X) 被破坏,Age 不再被破坏。 {Now} 仍然违反计数
  • Service105:计数 (X) Age(Y) 和 Delta (Z) 在 {now} 被破坏
  • Service106:Count (X) Age(Y) 和 Delta (Z) 违规行为于 {now} 结束

service102 和 service103 不会显示任何警报,因为它们为空/继续,因此我们不关心

最佳答案

有一个处理程序数组。每个处理程序都具有以下签名:

bool handle(char countAlertStatus, char ageAlertSatus, char deltaAlertStatus, out string message)
{
//...
}

如果您可以处理 CountAlertStatus/AgeAlertSatus/DeltaAlertStatus 的组合,则返回 true 并设置 message 否则返回 false

然后您可以很容易地向处理程序数组注册新的 lambda。

然后您只需遍历您的处理程序并在返回 true 时停止。

例子:

using System;
using System.Collections.Generic;

delegate bool MessageHandler(char countAlertStatus, char ageAlertSatus, char deltaAlertStatus, out string message);

class Program
{
static void Main(string[] args)
{
var handlers = new List<MessageHandler>();

//register lambda with array
handlers.Add(Handler1);

foreach (var handler in handlers)
{
// some fake input to each handler C/-/-
if (handler('C', '-', '-', out string message))
{
Console.WriteLine("handled: " + message);
}
}

Console.WriteLine("Done...");
Console.Read();
}

static bool Handler1(char countAlertStatus, char ageAlertSatus, char deltaAlertStatus, out string message)
{
if (countAlertStatus == 'C')
{
message = "Handled";

return true;
}
else
{
message = null;

return false;
}
}
}

关于c# - 将类解释为文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47532486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com