あなたのソリューションはうまくいくはずです...一致する最後の行、そしてその行だけです。
ただし、ここでは 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
。これは基本的に、「この要素の条件が true の場合、この要素を返すもののリストに追加し、そうでない場合は、追加しないでください。」そしてAggregate
、もう少し複雑です。基本的には、コレクションから最初の 2 つの項目を取得し、それらを介して値を返すラムダを渡します。次に、その結果と 3 番目の要素を使用してラムダを再度呼び出します。そして、その結果を受け取り、4 番目の要素でそれを呼び出します。等々。
これも機能する、あなたのものに似たいくつかのコードです:
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
) を作成します。その後、行を foreaches し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();