我有一个聊天机器人设置,可以使用标准的即时消息协议接收聊天消息。就像现在一样,聊天机器人每次发送消息时都会响应客户端。这意味着它会响应发送的每一行。我不想这样做,而是希望一次从客户端存储5条消息,并基于时间间隔而不是基于每个消息的间隔进行响应。以下是基于每个消息的间隔的示例:
Human: Hey there!
Bot: Hello!
Human: What is your favorite color?
Bot: Green
Human: Do you like animals?
Bot: I like your mother.
Human: HEY! >:(
我想要做的是每次为每个用户与机器人交谈时存储5行。由于每个用户都有唯一的userID,因此我可以将消息存储为一对多的关系。它看起来像这样:
UserID:(Message1, Message2, Message3, Message4, Message5)
所以上面的例子将存储为:
Human: ("Hey there!", "What is your favorite color?","Do you like animals?","HEY! >:(", Message5)
我希望列表有限,并在新条目出现且列表已满时替换第一个条目。基本上,它始终在此列表中保留最近的5条聊天消息。
我不确定应该使用什么类型的对象或函数来创建这种类型的关联数组。我需要能够检查是否已添加用户,并在用户停止与机器人通话时展开或折叠列表(我们不想要无限列表/我们应该垃圾收集未列出的列表)暂时使用)
如何有效地设置它以便我不会遇到资源问题,内存泄漏等?
答案 0 :(得分:2)
听起来你需要Dictionary<string, Queue<string>>
。像这样的方法将起作用。 (我是自由的。请原谅任何编译错误。)
Dictionary<string, Queue<string>> messageQueue = new Dictionary<string, Queue<string>>();
void AddMessage(string userName, string message)
{
Queue<string> queue;
if (!messageQueue.TryGetValue(userName, out queue))
{
queue = new Queue<string>();
messageQueue.Add(userName, queue);
}
queue.Enqueue(message);
while (queue.Count > 5)
queue.Dequeue();
}
void RemoveUser(string userName)
{
messageQueue.Remove(userName);
}