C#在列表框

时间:2015-07-25 12:46:10

标签: c# string text listbox

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

例如,如果服务器输出“[17:32:50 INFO]:Matt [127.0.0.1]使用实体ID 233登录([world]坐标世界)”并将其添加到控制台列表框作为项目,我希望能够抓住“马特”部分并将其添加到当前在玩家列表框中在线的玩家列表中。 “实体ID”和“世界中的坐标”每次都会有所不同,因此无法确定。

除此之外我还想做同样的事情,当玩家断开连接时,控制台列表框会添加一个会说“马特离开游戏”的项目,我需要它能够搜索玩家列表框“Matt”并删除该项目。

我想知道这是否可能,如果不是很清楚,请道歉!

3 个答案:

答案 0 :(得分:1)

foreach (var listBoxItem in listBox1.Items)
{
    // use the currently iterated list box item

    if (listBoxItem.ToString().Contains("logged"))
    {
        // Do your stuff here
    }
}

答案 1 :(得分:1)

修改

如果你想获得玩家的名字,然后在"在线玩家"中添加或删除它。列表框,您可以使用Substring()在从x index开始的字符串中搜索并选择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个consts,你可以根据需要进行更改。

这也应该在IP地址中使用或不使用/。所以要么" [111"或" [/ 111"应该仍然适用于此。希望这会有所帮助。

答案 2 :(得分:0)

您可以遍历列表框的项目并搜索已拆分的对象并选择" left"分裂的一面。

string CheckForMatchNames()
{
    foreach(string item in listbox.items)
        for (int i = 0; i < preDeterminedStringArrayThatMustMatchSomething.Length; i++)
            if (item.Split('[')[0] == preDeterminedStringArrayThatMatchesSomething[i])
                return preDeterminedStringArrayThatMustMatchSomething[i];
    return "none";
}