将richTextBox文本加载到数组中

时间:2014-06-04 10:35:59

标签: c# .net visual-studio

我有一个以下问题,因为我刚开始学习C#。

我有一个像这样定义的类:

public class Piksel
    {
        public int r;
        public int g;
        public int b;
    }

然后我声明一个这样的数组:

Piksel[,] tab2 = new Piksel[32, 32];

现在,我有一个* .txt文件,格式如下:

...

X: 15 , Y: 2 , R: 255 , G: 255 , B: 255

X: 16 , Y: 2 , R: 183 , G: 183 , B: 183

X: 17 , Y: 2 , R: 32 , G: 32 , B: 32

X: 18 , Y: 2 , R: 32 , G: 32 , B: 32

X: 19 , Y: 2 , R: 159 , G: 159 , B: 159

X: 20 , Y: 2 , R: 255 , G: 255 , B: 255

...

我将它加载到richTextBox:

 OpenFileDialog openF1 = new OpenFileDialog();
        openF1.InitialDirectory = "C:\\Users\\Nagash\\Desktop";
        openF1.Title = "Wybierz plik z danymi obrazka";
        openF1.DefaultExt = "*txt";
        openF1.Filter = "Pliki TXT|*txt";

        if (openF1.ShowDialog() == System.Windows.Forms.DialogResult.OK && openF1.FileName.Length > 0)
        {
            richTextBox3.LoadFile(openF1.FileName,RichTextBoxStreamType.PlainText);
        }

现在我的问题是:如何将这些数据放在richTextBox的tab2数组中。例如,如果richTextBox中的一行读取

X: 15 , Y: 2 , R: 255 , G: 255 , B: 255

那么我想要的是以下结果:

tab2[15,2].r=255 tab[15,2].g=255 tab[15,2].b=255

我喜欢摆弄像这样的正则表达式:

MatchCollection mc = Regex.Matches(richTextBox3.Text, "[0-9]+");
        foreach (Match str in mc)
            richTextBox1.Text= richTextBox1.Text + Convert.ToString(str);

但是我不确定如何判断一个数字是255还是25和5。还不确定如何将它放入数组中。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我不确定您将文本加载到文本框中取得了什么成果,但无论您从中获取要处理的文本,如果您通过一系列步骤进行处理,您可能是最好的选择:

首先,将文本拆分为行(因为看似一行对应一个像素)

var rows = text.Split("\r\n"); // Or only \r, whatever fits

然后,解析每一行并创建一个{ int X; int Y; int R; int G; int B; }形式的中间对象。或者你为每一行使用字典。

var inputs = rows.Select(r => Parse(r));

最后,迭代新创建的对象并处理每个对象。

foreach (var input in inputs)
{
    Piksel[input['X'], input['Y']] = new Piksel { r = input['R'], g = input['G'], b = input['B'] };
}

这将你的问题归结为如何解析以下形式的一行

X: 15 , Y: 2 , R: 255 , G: 255 , B: 255

进入一个字典,其中包含每个X,Y,R,G和B的值。这可以是应用正则表达式的正确位置。或者您再次使用Split

private Dictionary<string, int> Parse(string row)
{
    var keysAndValues= row.Split(',');
    var dict = new Dictionary<string, int>();

    foreach (var keyValue in keysAndValues)
    {
        var parts = value.Split(':');
        var key = parts[0];
        var value = int.Parse(parts[1]);

        dict[key] = value;
    }

    return dict;
}

答案 1 :(得分:0)

您好,您可以像这样保存文件:

15,2,255,255,255

并使用此函数分隔值:

  static  IEnumerable<string> LineSplitter(string line)
        {
            int fieldStart = 0;
            for (int i = 0; i < line.Length; i++)
            {
                if (line[i] == ',')
                {
                    yield return line.Substring(fieldStart, i - fieldStart);
                    fieldStart = i + 1;
                }
                if (line[i] == '"')
                    for (i++; line[i] != '"'; i++) { }
            }

        }

要将这些值转换为数组,请使用以下命令:

 IEnumerable<string>  res= LineSplitter(theString);
                  string[] array = res.Cast<string>().ToArray();

这是一个你应该改变它的例子。

我希望这会有所帮助。