1

我试图制作一个代码,在文本文件中搜索某个短语,然后如果其中出现短语,则用该行填充文本框。这段代码没有错误,但它根本不起作用。有谁知道出了什么问题?我不太确定我正在做的事情是否正确。

  {
    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];
        }
    }
4

2 回答 2

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对象(基本上是一个 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();
于 2013-06-01T07:36:13.497 回答
0

请注意,File.ReadAllLines 在 '\r' 或 '\n' 处断句。因此,如果您搜索“hello world”并且此文本在文件中分成 2 行(例如“... hello /n world”,您的代码将失败...

因此,请改用 ReadAllText(),返回一个包含所有文件文本的字符串。不过,您有时可能会遇到文件编码问题,但这是另一个问题。

之后,如果您找到要搜索的文本,您可以使用 ReadAllLines 来决定文本的位置。

于 2013-06-01T07:55:40.010 回答