消息解析器C#

时间:2016-08-25 14:24:26

标签: c# list

我一直试图制作某种消息解析器,它只获取我发送的消息。例如,如果我有这样的消息:

Viktor Bale (11 aug. 2016 13:20:56):
Hi! How are you?

Not Viktor Bale (11 aug. 2016 13:20:56):
Hi! Good! And you?

Viktor Bale (11 aug. 2016 13:20:56):
Me too! And this message has 
Two lines!

Not Viktor Bale (11 aug. 2016 13:20:56):
And this doesn't matter!

我只需要获取Viktor Bale写的消息 这是代码,我试过:

for (int i = 0; i < wordsList.Count; i++) 
{ 
    if (wordsList[i].StartsWith(defaultName)) 
    { 
        while (!wordsList[i].StartsWith(dialName)) 
        { 
            messages.Add(wordsList[i]); 
        } 
    }    
} 

wordsList是我的邮件列表,已从txt文件中收到并由ReadAllLines读取 所以上面的消息只是列表。

defaultName是我的名字,dialName是我的对话者的名字。

但是当我启动它时,我的应用程序只是冻结了。我该怎么做?

5 个答案:

答案 0 :(得分:2)

您忘记增加i

for (int i = 0; i < wordsList.Count; i++) 
{ 
    if (wordsList[i].StartsWith(defaultName)) 
    {
        while (i < worldList.Count && !wordsList[i].StartsWith(dialName)) 
        { 
            messages.Add(wordsList[i++]); 
        } 
    }    
} 

编辑:添加了安全边界检查。

答案 1 :(得分:0)

要避免无休止的while循环,请改用此代码:

for (int i = 0; i < wordsList.Count; i++) 
{ 
  if (wordsList[i].StartsWith(defaultName)) 
    { 
      if (!wordsList[i].StartsWith(dialName)) 
      { 
        messages.Add(wordsList[i]); 
      } 
    }    
}

您可以使用更简单的方法来实现所需的行为:

foreach (var word in wordsList) 
{ 
    if (word.StartsWith(defaultName)) 
    { 
        messages.Add(word); 
    }    
}

希望有所帮助

答案 2 :(得分:0)

while循环永远不会结束。

也许你的意思是这样的?我整理了你的代码并使其变得更简单。

User.findOneAndUpdate(id, {$push: 'addresses': {city:'something'}})

答案 3 :(得分:0)

您应该能够使用linq选择您的邮件,假设每行都以发件人的名字开头,而邮件不包含换行符。 e.g。

var myMessages = wordsList.Where(x => x.StartsWith(defaultName))

应用程序崩溃在你的while循环上,它只是评估条件无穷大但从未做任何改变它的事情。

答案 4 :(得分:0)

这是另外一种方法:

public static string ExtractSenderName(string line) {
    var i = line.IndexOf('(');
    if (i == -1)
        return string.Empty;

    return line.Substring(0, i).Trim();
}

public static void Main (string[] args) {

    var messages = new List<string>();
    for (int i = 0; i < wordsList.Length; i++) 
    {
        if (ExtractSenderName(wordsList[i]) == defaultName) {
            messages.Add(wordsList[++i]);
        }
    }

    foreach (var x in messages) {
        Console.WriteLine(x);
    }
}

以下是demo