消息解析器c#
本文关键字:消息 | 更新日期: 2023-09-27 18:04:11
我一直在尝试制作某种消息解析器,它只获取我发送的消息。例如,如果我有这样的消息:
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
是我的消息列表,ReadAllLines
从txt文件中接收并读取所以上面的消息就是list。
defaultName
是我的名字,dialName
是我的对话者的名字。
但是当我启动它时,我的应用程序只是冻结。我该怎么做呢?
您忘记增加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++]);
}
}
}
编辑:添加安全边界检查
while循环永远不会结束。
也许你是这个意思?我整理了你的代码,使它更简单。
foreach (var words in wordsList)
{
if (words.StartsWith(defaultName) && !words.StartsWith(dialName))
{
messages.Add(wordsList[i]);
}
}
您应该能够使用linq选择您的消息,假设每行以发送者的名称开始,并且消息不包括换行符。例如
var myMessages = wordsList.Where(x => x.StartsWith(defaultName))
应用程序在while循环中崩溃,while循环只是计算条件无穷大,但从不做任何事情来改变它。
要避免无休止的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);
}
}
希望有所帮助
可以这样做:
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);
}
}
这是演示