2011-02-08 89 views
1

嗨,我正在閱讀文本文件,並希望將每行放入一個單獨的變量。從我從編程類中記得的數組不能是動態的。所以,如果我設置15個數組,並且文本文件有1000行,我可以做什麼以及如何實現它。在文本文件中隨機選擇一行c#streamreader

事情只有一條線將需要,但我想要隨機選擇線。 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. 
     } 
+1

聽起來:您可以使用列表<>來代替,這是動態的

下面是一個如何可以做到這一點的例子。 – SLaks 2011-02-08 18:11:20

+0

我真的不明白代碼示例如何與問題相關。 – driis 2011-02-08 18:16:10

回答

4

將讀取給定文件的每一行成一個字符串數組。我認爲這應該是你想要的,但是你的問題有點難以遵循。

1

A List<T>是一個動態擴展列表。你可能想使用它來代替數組。

如果只有1000個元素,只需將它們讀入列表並選擇一個隨機元素。

0

如果您創建了該文件,那麼理想的方法是先存儲有關該文件的元數據(如行數),然後決定選擇哪個「隨機」行。

否則,你不能通過不使用它們來解決「數組」問題。而應使用存儲任意數量字符串的列表。在隨機選取一個之後,就像生成一個介於0和列表大小之間的隨機數一樣簡單。

您的問題已經完成,我建議使用Google搜索「從文件中讀取隨機行」。

3

你並不需要保存在內存中超過兩行同時...有偷偷摸摸的伎倆,你可以使用:

  • 創建隨機的一個實例,或採取一個作爲參數
  • 閱讀第一行。這將自動變爲「當前」行返回
  • 閱讀第二行,然後撥打Random.Next(2)。如果結果爲0,則使第二行爲「當前」行
  • 閱讀第三行,然後致電Random.Next(3)。如果結果爲0,則使第三行爲「當前」行
  • ...等
  • 當您到達文件末尾(reader.ReadLine返回空值)時,返回「當前」行。

下面是一個IEnumerable<T>一般實現 - 如果你正在使用.NET 4,你可以使用File.ReadLines()得到一個IEnumerable<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; 
    } 
} 
1

關於陣列的事..就像你正在尋找一個'清單 `

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