gpt4 book ai didi

C# 在列表框中查找特定文本

转载 作者:太空宇宙 更新时间:2023-11-03 10:25:48 25 4
gpt4 key购买 nike

我正在创建一个应用程序,该应用程序在后台运行 Java 服务器,并在每个新行中输出到控制台列表框。但是,我希望能够创建一个计时器,例如不断读取控制台列表框以获取某些预先确定但不具体的内容。

例如,如果服务器输出“[17:32:50 INFO]: Matt[127.0.0.1]logged in with entity ID 233 at ([world]co-ordinates in world)”并将其添加到控制台列表框作为一个项目,我希望能够捕获“Matt”部分并将其添加到玩家列表框中当前在线的玩家列表中。 “实体ID”和“世界坐标”每次都会不同,无法确定。

除此之外,我还想在玩家断开连接时做同样的事情,控制台列表框将添加一个项目,上面写着“Matt 离开游戏”,我需要它才能搜索玩家“Matt”的列表框并删除该项目。

我想知道这是否可能,如果不是很清楚,我们深表歉意!

最佳答案

编辑:

如果您想获取玩家姓名,然后将其添加到“在线玩家”列表框中或从中删除,您可以使用 Substring() 在从 x 索引开始的字符串中搜索并选择对于 y 长度。

这是为您准备的更新版本,应该适用于新格式:

private void cmdLogin_Click(object sender, EventArgs e)
{
// Add example logins
lstConsoleOutput.Items.Add("[17:32:50 INFO]: Amy[/127.0.0.1:12345]logged in with entity ID 233 at ([world]co-ordinates in world)");
lstConsoleOutput.Items.Add("[18:42:51 INFO]: Dan[/255.255.255.255:23451]logged in with entity ID 233 at ([world]co-ordinates in world)");
lstConsoleOutput.Items.Add("[19:33:27 INFO]: Matt[/1.1.1.1:34512]logged in with entity ID 233 at ([world]co-ordinates in world)");
lstConsoleOutput.Items.Add("[02:17:03 INFO]: Some Really Long Screen Name[/292.192.92.2:45123]logged in with entity ID 233 at ([world]co-ordinates in world)");
lstConsoleOutput.Items.Add("[09:05:55 INFO]: ABC $!@#$ 12341234[/127.0.0.1:51234]logged in with entity ID 233 at ([world]co-ordinates in world)");

AnalyzeConsoleOutput(lstConsoleOutput, lstOnlinePlayers);
}

private void cmdLogout_Click(object sender, EventArgs e)
{
// Add example logouts
lstConsoleOutput.Items.Add("[22:12:12 INFO]: Amy left the game");
lstConsoleOutput.Items.Add("[23:44:15 INFO]: Matt left the game");
lstConsoleOutput.Items.Add("[24:00:00 INFO]: ABC $!@#$ 12341234 left the game");

AnalyzeConsoleOutput(lstConsoleOutput, lstOnlinePlayers);
}

private void AnalyzeConsoleOutput(ListBox listboxToAnalyze, ListBox onlinePlayersListbox)
{
const string LoginIdentifier = "]logged in with entity";
const string LogoutIdentifer = " left the game";
string playerName;

foreach (var item in listboxToAnalyze.Items)
{
// Check if a player has logged in and add them to the players list box
if (item.ToString().Contains(LoginIdentifier))
{
int startOfPlayerNameIndex = item.ToString().IndexOf("]: ") + 3;
int lengthOfPlayerName = item.ToString().IndexOf('[', item.ToString().IndexOf('[') + 1) - startOfPlayerNameIndex;

playerName = item.ToString().Substring(startOfPlayerNameIndex, lengthOfPlayerName);

if (!onlinePlayersListbox.Items.Contains(playerName))
{
onlinePlayersListbox.Items.Add(playerName);
}
}

// Check if a player has logged out and remove them from the players list box
if (item.ToString().Contains(LogoutIdentifer))
{
int startOfPlayerNameIndex = item.ToString().IndexOf("]: ") + 3;
int lengthOfPlayerName = item.ToString().IndexOf(LogoutIdentifer, 0) - startOfPlayerNameIndex;

playerName = item.ToString().Substring(startOfPlayerNameIndex, lengthOfPlayerName);

if (onlinePlayersListbox.Items.Contains(playerName))
{
onlinePlayersListbox.Items.Remove(playerName);
}
}
}
}

现在使用 2 个变量设置玩家姓名的起始索引,另一个设置要计数的字符数。通过这种方式,如果将来格式发生变化,您只需要更新这些东西,其他一切都应该仍然有效。我还保留了 LoginIdentifier 和 LogoutIdentifier 的 2 个常量,您可以根据需要进行更改。

这在 IP 地址中有或没有/也应该有效。所以“[111”或“[/111”应该仍然可以正常工作。希望这会有所帮助。

关于C# 在列表框中查找特定文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31626579/

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