您的解决方案应该有效......对于匹配的最后一行,并且只有那一行。
不过,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
对象(基本上是一个 mutable 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();