C # String Pattern Matching - PullRequest
       7

C # String Pattern Matching

0 голосов
/ 04 июня 2011

У меня есть 2 списка строк в C #, показывающих игроков, которые присоединились и вышли из определенной игры. Я пытаюсь определить, кто еще в игре, сопоставляя оба списка и исключая записи тех, кто покинул игру. Пожалуйста, предложите простой и безболезненный алгоритм для этого. Мой текущий код выглядит следующим образом

string input = inputTextBox.Text;
        string[] lines = input.Split(new string[] {"\r\n", "\n"}, StringSplitOptions.None);
        List<string> filteredinput = new List<string>();
        List<string> joinedlog = new List<string>();
        List<string> leftlog = new List<string>();

        for (int i = 0; i<lines.Length; i++)
        {
            if (lines[i].Contains("your game!"))
            filteredinput.Add(lines[i]);
        }

        for (int i =0; i<filteredinput.Count; i++)
        {
            if (filteredinput[i].Contains("joined"))
                joinedlog.Add(filteredinput[i]);

            else if (filteredinput[i].Contains("left"))
                leftlog.Add(filteredinput[i]);

        }

Вот пример ввода:

{SheIsSoScrewed}[Ping:|]  has joined your game!.
{AngeLa_Yoyo}[Ping:X]  has joined your game!.
{SheIsSoScrewed}  has left your game!(4).

Ответы [ 6 ]

2 голосов
/ 04 июня 2011

Вы спрашиваете, как получить два списка или как найти текущих игроков после того, как вы уже получили два списка?

Вторая часть может быть сделана с Linq ....

List<string> joinedGame;
List<string> leftGame;

List<string> currentInGame 
          = joinedGame.Where(x => !leftGame.Contains(x)).ToList();

РЕДАКТИРОВАТЬ В ответ на ваш комментарий, прочитав ваш вопрос еще раз, очевидно, что вышеописанное не сработает, потому что вы строите свои списки странным образом.

Вы сохраняете всю строку в списке, например, user_1 has left the game, то, что вы, вероятно, должны делать, это просто сохранять имя пользователя. Если вы исправите это, то приведенный выше код делает именно то, что вы хотите.

Полный пример:

var input = new List<string>()
{
    "user_1 has joined the game",
    "user_2 has joined the game",
    "user_1 has left the game",
    "user_3 has joined the game"
};

var joined = new List<string>();
var left = new List<string>();

foreach(string s in input)
{   
    var idx = s.IndexOf(" has joined the game");
    if (idx > -1)
    {
        joined.Add(s.Substring(0, idx)); 
        continue;
    }

    idx = s.IndexOf(" has left the game");
    if (idx > -1)
    {
        left.Add(s.Substring(0, idx)); 
    }
}

var current = joined.Where(x => !left.Contains(x)).ToList();

foreach(string user in current)
{
    Console.WriteLine(user + " is still in the game"); 
}
0 голосов
/ 04 июня 2011
string input = inputTextBox.Text;
string[] lines = input.Split(new string[] {"\r\n", "\n"}, StringSplitOptions.None);

Regex joinedLeft = new Regex(@"\{([^{}]*)}.*? has (joined|left) your game!");
HashSet<string> inGame = new HashSet<string>();
foreach (string line in lines)
{
    Match match = joinedLeft.Match(line);
    if (!match.Success)
        continue;

    string name = match.Groups[1].Value;
    string inOrOut = match.Groups[2].Value;

    if (inOrOut == "joined")
        inGame.Add(name);
    else
        inGame.Remove(name);
}
0 голосов
/ 04 июня 2011

Сначала вам нужно извлечь имена игроков, чтобы вы могли вычислить разницу:

var join=new Regex("{(.*)}[.*joined.*?your game");
var joinedNames = filteredinput.Select(l => join.Match(l)).Where(m => m.Success).Select(m => m.Groups[1]).Distinct();

var left=new Regex("{(.*)}[.*left.*?your game");
var leftNames = filteredinput.Select(l => left.Match(l)).Where(m => m.Success).Select(m => m.Groups[1]).Distinct();

Теперь вычислите разницу:

var playersStillInGame = joinedNames.Except(leftNames);
0 голосов
/ 04 июня 2011

используйте linq и регулярное выражение:

var join=new Regex("joined.*?your game");    
var joinLog = (from l in lines where join.IsMatch(join) select l).ToList();

var left=new Regex("left.*?your game");    
var leftLog = (from l in lines where left.IsMatch(join) select l).ToList();
0 голосов
/ 04 июня 2011

Как насчет использования List.Find ()? Ссылка 1 здесь Ссылка 2 здесь

0 голосов
/ 04 июня 2011

Пересекаются и За исключением ваши друзья.

Кроме того, если это единственная цель списков, рассмотрите возможность использования чего-то вроде HashSet .

...