我一直试图制作某种消息解析器,它只获取我发送的消息。例如,如果我有这样的消息:
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
是我的对话者的名字。
但是当我启动它时,我的应用程序只是冻结了。我该怎么做?
答案 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