我试图创建一个代码,在文本文件中搜索某个短语,然后在该文本框中填充一个短语。此代码没有错误,但它根本不起作用。谁知道什么是错的?我不太确定我所做的事情是否正确无误。
{
tuitDisplayTextBox.Text = "";
string[] tuitFilePath = File.ReadAllLines(Server.MapPath("~") +"/App_Data/tuitterMessages.txt");
for (int i = 0; i < tuitFilePath.Length; i++)
{
if (tuitFilePath[i].Contains(searchTextBox.Text))
{
tuitDisplayTextBox.Text += tuitFilePath[i];
}
}
答案 0 :(得分:1)
您的解决方案应该有效...对于匹配的最后一行,只有那一行。
LINQ可以帮助你。这是一个应该有效的解决方案。
tuitDisplayTextBox.Text =
File.ReadLines(Server.MapPath("~") +"/App_Data/tuitterMessages.txt")
.Where(n => n.Contains(searchTextBox.Text)).Aggregate((a, b) =>
a + Enviroment.NewLine + b);
这里,它的作用是将文件的行读入IEnumerable<string>
,然后使用Where
方法对其进行过滤,这基本上意味着“如果此元素的条件为真,将此元素添加到要返回的事物列表中,否则不要添加它“。然后Aggregate
有点复杂。基本上它的作用是从集合中获取前两个项目,然后通过它们传递一个返回值的lambda。然后使用该结果和第三个元素再次调用lambda。然后它需要 结果并使用第四个元素调用它。等等。
以下是一些与您的代码更相似的代码:
tuitDisplayTextBox.Text = "";
IEnumerable<string> lines =
File.ReadAllLines(Server.MapPath("~") +"/App_Data/tuitterMessages.txt");
StringBuilder sb = new StringBuilder
foreach (string line in lines)
{
if (line.Contains(searchTextBox.Text))
{
sb.AppendLine(line);
}
}
tuitDisplayTextBox.Text = sb.ToString();
这里有点不同。首先,它将所有行读入IEnumerable<string>
个被调用的行。然后它创建一个StringBuilder
对象(基本上是一个可变的string
)。之后,它会预测IEnumerable<string>
中的行(我认为这里更合适)然后如果该行包含您想要的文本,它会将该行和换行添加到StringBuilder
对象。之后,它通过获取string
实例的StringBuilder
表示,将文本框的文本设置为所有文本的结果。
如果你真的想要一个for循环,这里的代码被修改为使用for循环:
tuitDisplayTextBox.Text = "";
string[] lines =
File.ReadAllLines(Server.MapPath("~") +"/App_Data/tuitterMessages.txt");
StringBuilder sb = new StringBuilder
for (int i = 0; i < lines.Length; i++)
{
if (lines[i].Contains(searchTextBox.Text))
{
sb.AppendLine(lines[i]);
}
}
tuitDisplayTextBox.Text = sb.ToString();
答案 1 :(得分:0)
请注意,File.ReadAllLines会在'\ r'或'\ n'处中断句子。 所以,如果你搜索“你好世界”并且这个文本在文件中分成2行(例如“... hello / n world”,你的代码就会失败......
因此,使用ReadAllText()代替,返回一个包含所有文件文本的字符串。 尽管如此,您有时可能会遇到文件编码问题,但这是另一个问题。
之后,如果您找到要搜索的文本,可以使用ReadAllLines来确定文本的位置。