1

こんにちは、私はテキスト ファイルから読み込んでおり、各行を個別の変数に入れたいと考えています。私のプログラミングクラスから覚えていることから、配列は動的にすることはできません。したがって、15 個の配列を設定し、テキスト ファイルに 1000 行ある場合、何ができ、どのように実装すればよいでしょうか。

必要なのは1行だけですが、行をランダムに選択したいです。linetext は、すべてのリクエストの末尾に \r\n が追加されたテキスト ファイル全体です。

\r\n をランダムに選択してから 4 を数え、次の \r\n まで文字列を追加します。このアイデアの問題は、呼び出される文字列に \ も含まれることです。何かアイデアはありますか?

if (crawler == true)
   {
            TextReader tr = new StreamReader("textfile.txt");
            while (tr.Peek() != -1)
            {
                linktext = linktext + tr.ReadLine() + "\r\n";
            }

            //link = linktext;

            hi.Text = linktext.ToString();

            timer1.Interval = 7000; //1000ms = 1sec 7 seconds per cycle
            timer1.Tick += new EventHandler(randomLink); //every cycle randomURL is called.
            timer1.Start(); // start timer.
        }
4

5 に答える 5

4

File.ReadAllLines(...)は、指定されたファイルのすべての行を文字列の配列に読み取ります。それはあなたが望むものであるべきだと思いますが、あなたの質問はちょっと難しいです。

于 2011-02-08T18:13:12.547 に答える
3

一度に 2 行以上をメモリに保持する必要はありません... 使用できる卑劣なトリックがあります。

  • Random のインスタンスを作成するか、パラメーターとして取得します
  • 最初の行を読みます。これは自動的に返される「現在の」行になります
  • 2 行目を読み、 を呼び出しますRandom.Next(2)。結果が 0 の場合、2 行目を「現在の」行にする
  • 3 行目を読み、 を呼び出しますRandom.Next(3)。結果が 0 の場合、3 行目を「現在の」行にする
  • ...など
  • ファイルの最後に到達すると ( reader.ReadLinenull を返す)、「現在の」行を返します。

an の一般的な実装を次に示しIEnumerable<T>ます。.NET 4 を使用している場合は、これを使用File.ReadLines()して anIEnumerable<string>を渡すことができます。(この実装には、実際に必要なものよりも少し多く含まれています。最適化されていますIList<T>。)

public static T RandomElement<T>(this IEnumerable<T> source,
                                 Random random)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }
    if (random == null)
    {
        throw new ArgumentNullException("random");
    }
    ICollection collection = source as ICollection;
    if (collection != null)
    {
        int count = collection.Count;
        if (count == 0)
        {
            throw new InvalidOperationException("Sequence was empty.");
        }
        int index = random.Next(count);
        return source.ElementAt(index);
    }
    ICollection<T> genericCollection = source as ICollection<T>;
    if (genericCollection != null)
    {
        int count = genericCollection.Count;
        if (count == 0)
        {
            throw new InvalidOperationException("Sequence was empty.");
        }
        int index = random.Next(count);
        return source.ElementAt(index);
    }
    using (IEnumerator<T> iterator = source.GetEnumerator())
    {
        if (!iterator.MoveNext())
        {
            throw new InvalidOperationException("Sequence was empty.");
        }
        int countSoFar = 1;
        T current = iterator.Current;
        while (iterator.MoveNext())
        {
            countSoFar++;
            if (random.Next(countSoFar) == 0)
            {
                current = iterator.Current;
            }
        }
        return current;
    }
}
于 2011-02-08T18:15:33.340 に答える
1

AList<T>は動的に展開するリストです。配列の代わりにそれを使用したい場合があります。

要素が 1000 個しかない場合は、それらをリストに読み込み、ランダムな要素を選択します。

于 2011-02-08T18:13:31.840 に答える
1

配列のことに関して..代わりに List<> を使用できます。これは動的です

これを実現する方法の例を次に示します。

public static string GetRandomLine(ref string file) {
    List<string> lines = new List<string>();
    Random rnd = new Random();
    int i = 0;

    try {
        if (File.Exists(file)) {
            StreamReader reader = new StreamReader(file);
            while (!(reader.Peek() == -1))
                lines.Add(reader.ReadLine());
            i = rnd.Next(lines.Count);
            reader.Close();
            reader.Dispose();
            return lines[i].Trim();
        }
        else {
            return string.Empty;
        }
    }
    catch (IOException ex) {
        MessageBox.Show("Error: " + ex.Message);
        return string.Empty;
    }
}
于 2011-02-08T18:19:04.833 に答える
0

ファイルを作成する場合、理想的な方法は、行数などのファイルに関するメタデータを事前に保存してから、選択する「ランダム」行を決定することです。

そうしないと、それらを使用しないことで「配列」の問題を回避できません。代わりに、任意の数の文字列を格納するリストを使用してください。その後、ランダムなものを選択するのは、0 とリストのサイズの間の乱数を生成するのと同じくらい簡単です。

あなたの問題は以前に解決されました。「C# read random line from file」をグーグルで検索することをお勧めします。

于 2011-02-08T18:14:28.887 に答える