版上的神人大家好
小弟最近剛剛開始寫程式
遇到一個問題,在我讀取檔案後,將內部數字轉成十六進制
再將數值放到RichTextBox上
顯示出來的速度非常慢
請問有沒有其他解
註:資料數量大約有26萬筆。
private void button1_Click(object sender, EventArgs e)
{
folderBrowserDialog1.SelectedPath = @"D:\project\aaa.aa";
string folderPath = folderBrowserDialog1.SelectedPath;
FileStream myfile = File.Open(folderPath, FileMode.OpenOrCreate,FileAccess.ReadWrite);
BinaryReader myReader = new BinaryReader(myfile);
int dl =System.Convert.ToInt32(myfile.Length);
Byte[] data = myReader.ReadBytes(dl);
label1.Text += dl;
for (int i = 0; i < dl; i++)
{
richTextBox1.Text += Convert.ToString(data[i], 16);
richTextBox1.Text += "\t";
Application.DoEvents();
}
myReader.Close();
myfile.Close();
}
另外有一個小小的疑問,我是使用Convert.ToString(data[i], 16)的方式來轉換成十六進制
但是,給我資料的人說這個資料是十六進制的
所以一開始我直接使用richTextBox1.Text +=data[i];
顯示出來的是十進制的數字,這是何原因呢?
改善速度提出以下兩個做法(可同時使用)
A.fillano 大大的 StringBuilder (A1做法)
如下標註為 A 的程式碼,其中
A1 是「先全部組好字串,最後再一次顯示在 TextBox 上」
A2 是「持續組字串,每加一個就更新原本的 TextBox」
A1 會比 A2 快很多
B.以查表取代原 Convert.ToString
如下標註為 B 的程式碼
如要使用
String[] table 你要自己加到 "FE","FF"}; 為止
至於 data[i] 到底是10進制還是16進制
請看 Byte[] data 宣告初值那列
data[] 是 0, 15, 14 (數值就是數值)
當你「用 16 進制顯示」時,會看到 0, 0F, 0E
當你「用 2 進制顯示」時,會看到 0000, 1111, 1110
而不管如何顯示
data[] 永遠是 0x00, 0x0F, 0x0E (數值就是數值)
using System;
using System.Text;
public class Program
{
public static void Main()
{
int dl = 3;
Byte[] data = {0x00, 15, 0x0E};
StringBuilder sb = new StringBuilder(); //A
String[] table = {"00","01","02","03","04","05","06","07","08","09","0A","0B","0C","0D","0E","0F"}; //B
for (int i = 0; i < dl; i++)
{
sb.Append(Convert.ToString(data[i],16)).Append('\t'); //A
//sb.Append(table[data[i]]).Append('\t'); //B
//richTextBox1.Text += sb.ToString(); //A2
Console.WriteLine(sb.ToString()); //A2
}
//richTextBox1.Text = sb.ToString(); //A1
Console.WriteLine(sb.ToString()); //A1
}
}
同意fillano大大的話,
你會慢主要是因為一直去改控制項的資料,
加上Application.DoEvents();也會影響效能,
應該要先把字串組好之後,
一次性地改控制項即可.
StringBuilder可以改善字串處理的速度,
雖然說以你目前的程式應該影響不大,
不過如果要處理大量的資料就會差很多,
甚至有可能遇到string無法處理的情況.