c# - 如何在 C# 中创建与键 (userID) 配对的固定长度字符串数组(聊天消息)

标签 c# arrays associative-array

我设置了一个聊天机器人,可以使用标准即时消息协议(protocol)接收聊天消息。现在,每次发送消息时,聊天机器人都会响应客户端。这意味着它响应发送的每一行。我不想这样做,而是希望一次存储来自客户端的 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 条聊天消息。

我不确定应该使用什么类型的对象或函数来创建这种类型的关联数组。我需要能够检查用户是否已添加,如果用户停止与机器人对话,则展开或折叠列表(我们不想要无限列表/我们应该垃圾收集尚未添加的列表)使用了一段时间)

如何有效地进行设置,以免遇到资源问题、内存泄漏等问题?

最佳答案

听起来你需要一个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);
}

关于c# - 如何在 C# 中创建与键 (userID) 配对的固定长度字符串数组(聊天消息),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20252521/

相关文章:

c# - 无法应用运算符 &&

c# - 多键数据结构

c - 如果我发现列表在任何中间点(冒泡排序)中排序,如何停止我的进程?

PHP 按值重新排序数组

c# - UpdatePanel 不更新图像按钮单击事件

java - 非循环依赖原则 - 组件依赖循环如何成为 "morning-after syndrome"的原因?

c++ - 合并排序与 pthreads 在 c++ 中不起作用

java - 将图形网格与二维数组网格相匹配

arrays - 如何将 Coffeescript 关联数组(即哈希)中的值提取到简单数组中?

javascript - 在 javascript 中的 map() 中动态设置 key ?