0

ファイルからランダムな行を取得します:

using (FileStream ifs = new FileStream(path, FileMode.Open, FileAccess.Read)) {
    using (StreamReader sr = new StreamReader(ifs, Encoding)) {
        long lastPos = ifs.Seek(0, SeekOrigin.End);
        long rndPos = 0;
          do {
              rndPos = (long)(Random.NextDouble() * lastPos);// Random is property
              ifs.Seek(rndPos, SeekOrigin.Begin);
              sr.ReadLine();
              line = sr.ReadLine();
          } while (string.IsNullOrWhiteSpace(line));
    }
}

しかし、行が常に null で、ループが無限であることが判明することがあります。お願いします、どこが間違っていますか?

この関数は 1000 回呼び出されます (たとえば)。最初の 100 回の呼び出しは成功しますが、メイン ストリームの位置が最後の位置になり、シークが機能しません。

ps: ファイル内のランダムな位置を取得したい。次に、この位置の行を最後まで読み、結果として次の行を返します。ループ内で大きなファイルのランダムな文字列を取得する最速のアルゴリズムです。はい、この関数が最初の行を返さないことはわかっています。

4

2 に答える 2

0
public string ReturnRandomLine(string path, ref Random r)
{
    string[] lines = File.ReadAllLines(path);
    string randomLine = String.Empty;
    int randomLineNumber;

    do
    {
        randomLineNumber = r.Next(0, lines.Length - 1);
        randomLine = lines[randomLineNumber];
    } while (String.IsNullOrWhiteSpace(randomLine));

    return @"Line #" + randomLineNumber + " " + randomLine;
}
于 2013-02-14T06:59:14.680 に答える
0

行が null で、条件が string.IsNullOrWhiteSpace(line) の場合、無限ループになります。

于 2013-02-14T06:59:03.083 に答える