在文本文件中搜索短语然后显示该行

时间:2013-06-01 07:32:02

标签: c# asp.net search for-loop

我试图创建一个代码,在文本文件中搜索某个短语,然后在该文本框中填充一个短语。此代码没有错误,但它根本不起作用。谁知道什么是错的?我不太确定我所做的事情是否正确无误。

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

2 个答案:

答案 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来确定文本的位置。