1

コード行を挿入しようとしているテキスト ファイルがあります。リンク リストを使用すると、すべてのデータを取り出して並べ替え、新しいテキスト ファイルにする必要がなくなると思います。私がしたことは、以下のコードを思いついたことです。ブール値を設定しましたが、まだ機能していません。私はデバッガーを調べましたが、リスト全体 (約 10,000 行) を処理しているように見えますが、真であることが何も見つからないため、コードが挿入されません。

このコードの何が問題なのですか?

List<string> lines = new List<string>(File.ReadAllLines("Students.txt"));


 using (StreamReader inFile = new StreamReader("Students.txt", true))
 {
    string newLastName = "'Constant";
    string newRecord = "(LIST (LIST 'Constant 'Malachi 'D ) '1234567890 'mdcant@mail.usi.edu 4.000000 )";
    string line;
    string lastName;
    bool insertionPointFound = false;
    for (int i = 0; i < lines.Count && !insertionPointFound; i++)
    {
        line = lines[i];
        if (line.StartsWith("(LIST (LIST "))
        {
            values = line.Split(" ".ToCharArray());
            lastName = values[2];
            if (newLastName.CompareTo(lastName) < 0)
            {
                lines.Insert(i, newRecord);
                insertionPointFound = true;
            }
        }
    }
    if (!insertionPointFound)
    {
        lines.Add(newRecord);
    }
4

2 に答える 2

4

ファイルをメモリに読み込むだけで、どこにもコミットしていません。

残念ながら、ファイル全体を読み込んで完全に書き直す必要があります。ファイルは追加をサポートしていますが、挿入はサポートしていません。

ファイルから読み取るのと同じ方法でファイルに書き込むことができます

string[] lines;
/// instanciate and build `lines`
File.WriteAllLines("path", lines);

WriteAllLinesも取るIEnumerableので、必要Listに応じてそこに文字列を貼り付けることができます。


もう 1 つの問題: ファイルを 2 回読んでいるように見えます。1 つReadAllLinesはあなたのStreamReader.

于 2013-10-21T21:32:36.597 に答える
2

少なくとも 4 つのエラーが考えられます。

  • ストリームリーダーを開く必要はありません。すでにすべての行を読んでいます。(まあ、エラーではないですが…)
  • 行が空白で始まると、StartsWith のチェックがだまされる可能性があり、insertionPoint を見逃す可能性があります。(トリムを追加すると、ここで問題が解消されます)
  • CompareTo行では、< 0 をチェックしますが、== 0 をチェックする必要があります。文字列が等しい場合、CompareTo は 0 を返しますが.....
  • 2 つの文字列が等しいかどうかを確認するには、上記の MSDN リンクで説明されているように CompareTo を使用しないで、string.Equals を使用する必要があります。

    List<string> lines = new List<string>(File.ReadAllLines("Students.txt"));
    string newLastName = "'Constant";
    string newRecord = "(LIST (LIST 'Constant 'Malachi 'D ) '1234567890 'mdcant@mail.usi.edu 4.000000 )";
    string line;
    string lastName;
    bool insertionPointFound = false;
    for (int i = 0; i < lines.Count && !insertionPointFound; i++)
    {
        line = lines[i].Trim();
        if (line.StartsWith("(LIST (LIST "))
        {
            values = line.Split(" ".ToCharArray());
            lastName = values[2];
            if (newLastName.Equals(lastName))
            {
                lines.Insert(i, newRecord);
                insertionPointFound = true;
            }
        }
     }
     if (!insertionPointFound)
         lines.Add(newRecord);
    

ファイルへの書き戻しの欠落をエラーとしてリストしません。コードのその部分を省略したことを願っています。それ以外は非常に単純な問題です。(ただし、CompareTo使用方法がおそらく問題の主な理由だと思います)

編集下のコメントを見ると、からの答えSam I Amがあなたにとって正しいようです。もちろん、変更された行の配列を書き戻す必要があります。すべての変更はメモリ内の行の配列に対して行われ、ファイルを書き込むコードがない場合、ファイルには何も書き戻されません。ただし、新しいファイルは必要ありません

File.WriteAllLines("Students.txt", lines);
于 2013-10-21T21:36:32.060 に答える