我有一个以下问题,因为我刚开始学习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。还不确定如何将它放入数组中。
感谢您的帮助。
答案 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();
这是一个你应该改变它的例子。
我希望这会有所帮助。