C# - 代码不是 运行,我不明白为什么
C# - Code not running and I can't figure out why
我目前正在使用 Discord.NET 创建一个 Discord 机器人,但我认为这并不重要,我正在尝试对字典进行一些检查,并且我已经 运行进入一些代码没有 运行 的问题,我可以找出原因。让我尝试总结一下代码。
private Dictionary<Server, Dictionary<User, ChatterBotSession>> sessions = new Dictionary<Server, Dictionary<User, ChatterBotSession>>();
if (sessions.Any())
{
if (sessions[e.Server].Any())
{
await e.Channel.SendMessage("Sorry, I'm already talking to someone on this server.").ConfigureAwait(false);
return;
}
}
ChatterBotFactory factory = new ChatterBotFactory();
ChatterBot.ChatterBot bot = factory.Create();
ChatterBotSession session = bot.CreateSession();
Dictionary<User, ChatterBotSession> sessionDic = new Dictionary<User, ChatterBotSession>();
sessionDic.Add(e.User, session);
sessions.Add(e.Server, sessionDic);
await e.Channel.SendMessage("Added dicionary entry with server '" + e.Server.Name + "' and user '" + e.User.Name + "'");
因此,当此代码首次执行时,它会通过并发送带有 "await e.Channel.SendMessage(...);" 的消息。如果我在同一个 Discord 服务器上执行此代码,它会识别字典中的服务器并在 "already talking to someone" 消息处停止。所以这一切都很好,花花公子。但是,如果我随后转到另一台服务器,它会通过 "sessions.Any()" if 和 "if(sessions[e.Server].Any())",因为它不是那个服务器,所以它不会进入那个 if,但它会停止!在我看来,它 应该 在 "sessions.Any()" if 之外继续。
我在这里错过了什么?
我设法找到了解决方案。我得到了将其包装成 try and catch 的建议,但我发现密钥不存在。出于某种原因,它没有告诉我。所以我随后检查了密钥是否确实存在,现在我处理得更好了,所以其余的代码正在执行。
这是一些更新后的代码。
private Dictionary<Server, ChatSession> sessions = new Dictionary<Server, ChatSession>();
if (sessions.Any())
{
if (sessions.ContainsKey(e.Server))
{
if(sessions[e.Server].User == e.User)
{
await e.Channel.SendMessage(e.User.Mention + " I'm already talking to you! :P");
return;
}
else
{
await e.Channel.SendMessage(e.User.Mention + " I'm already talking to someone here. Try again later.");
return;
}
}
else
{
await e.Channel.SendMessage("This server is not stored, continuing.");
}
}
我目前正在使用 Discord.NET 创建一个 Discord 机器人,但我认为这并不重要,我正在尝试对字典进行一些检查,并且我已经 运行进入一些代码没有 运行 的问题,我可以找出原因。让我尝试总结一下代码。
private Dictionary<Server, Dictionary<User, ChatterBotSession>> sessions = new Dictionary<Server, Dictionary<User, ChatterBotSession>>();
if (sessions.Any())
{
if (sessions[e.Server].Any())
{
await e.Channel.SendMessage("Sorry, I'm already talking to someone on this server.").ConfigureAwait(false);
return;
}
}
ChatterBotFactory factory = new ChatterBotFactory();
ChatterBot.ChatterBot bot = factory.Create();
ChatterBotSession session = bot.CreateSession();
Dictionary<User, ChatterBotSession> sessionDic = new Dictionary<User, ChatterBotSession>();
sessionDic.Add(e.User, session);
sessions.Add(e.Server, sessionDic);
await e.Channel.SendMessage("Added dicionary entry with server '" + e.Server.Name + "' and user '" + e.User.Name + "'");
因此,当此代码首次执行时,它会通过并发送带有 "await e.Channel.SendMessage(...);" 的消息。如果我在同一个 Discord 服务器上执行此代码,它会识别字典中的服务器并在 "already talking to someone" 消息处停止。所以这一切都很好,花花公子。但是,如果我随后转到另一台服务器,它会通过 "sessions.Any()" if 和 "if(sessions[e.Server].Any())",因为它不是那个服务器,所以它不会进入那个 if,但它会停止!在我看来,它 应该 在 "sessions.Any()" if 之外继续。
我在这里错过了什么?
我设法找到了解决方案。我得到了将其包装成 try and catch 的建议,但我发现密钥不存在。出于某种原因,它没有告诉我。所以我随后检查了密钥是否确实存在,现在我处理得更好了,所以其余的代码正在执行。
这是一些更新后的代码。
private Dictionary<Server, ChatSession> sessions = new Dictionary<Server, ChatSession>();
if (sessions.Any())
{
if (sessions.ContainsKey(e.Server))
{
if(sessions[e.Server].User == e.User)
{
await e.Channel.SendMessage(e.User.Mention + " I'm already talking to you! :P");
return;
}
else
{
await e.Channel.SendMessage(e.User.Mention + " I'm already talking to someone here. Try again later.");
return;
}
}
else
{
await e.Channel.SendMessage("This server is not stored, continuing.");
}
}