C# 将richTextBox文本加载到数组中
我有一个问题,因为我刚刚开始学习C 我有一个这样定义的类:C# 将richTextBox文本加载到数组中,c#,.net,visual-studio,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
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。还不确定如何将其放入阵列中
谢谢您的帮助。您好,您可以这样保存文件: 15,22555255 并使用此函数来分隔值:
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行拆分器(字符串行)
{
int fieldStart=0;
for(int i=0;i
要将这些值转换为数组,请使用以下命令:
IEnumerable<string> res= LineSplitter(theString);
string[] array = res.Cast<string>().ToArray();
IEnumerable res=LineSplitter(字符串);
字符串[]数组=res.Cast().ToArray();
这是一个你应该改变的例子
我希望这会有所帮助。我不确定将文本加载到文本框中会带来什么好处,但无论您从何处获取要处理的文本,如果您通过一系列步骤进行处理,可能会是最好的选择: 首先,将文本拆分为行(因为似乎一行对应一个像素) 然后,解析每一行并创建一个中间对象,其形式为
{intx;inty;intr;intg;intb;}
。或者每行使用一本字典
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;
}
专用字典解析(字符串行)
{
var keysAndValues=row.Split(',');
var dict=新字典();
foreach(keysAndValues中的var keyValue)
{
var parts=value.Split(“:”);
var键=零件[0];
var值=int.Parse(部分[1]);
dict[键]=值;
}
返回命令;
}
您好,谢谢您的回答。然而,我需要我的文本文件的格式,包括字母和“:”。有没有办法重写您提供的包含该格式的函数?是的,因为您可以看到字符串中的每个字符都被选中,所以您可以重写它。看一看:嘿,谢谢您的精彩解释。我不会通过将文本放入rTB来“赢得”任何东西,这只是我为我的类所做的一个程序,其中一个要求是将txt文件加载到rTB中,所以我想知道为什么不在做其他事情的同时再做它。我现在还不太理解你的代码,但我会阅读你使用的命令。再次感谢。@user3706568-明白了。只需一个问题,代码中的r是什么,一个变量?如果是的话,哪一个?@NagashTDN:r=>Parse(r)
是一个。它使用一个名为r
的参数定义函数,该参数是“行”的缩写。类型string
是自动推断的,因为您对字符串集合执行Select
Select
遍历字符串数组(即文本行),并为每一行调用Parse
,将该行作为参数传递。
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;
}