C# C10文本框,用于显示数组项,每个文本框中有30行,用逗号分隔
我有10个不同的文本框控件和一个按钮点击文本文件上传脚本。我希望当用户上传一个文本文件时,它可能包含300行,它被分成10个不同的文本框,每个文本框中有30行,每行用逗号分隔。我使用数组来存储文本文件项C# C10文本框,用于显示数组项,每个文本框中有30行,用逗号分隔,c#,.net,arrays,string,C#,.net,Arrays,String,我有10个不同的文本框控件和一个按钮点击文本文件上传脚本。我希望当用户上传一个文本文件时,它可能包含300行,它被分成10个不同的文本框,每个文本框中有30行,每行用逗号分隔。我使用数组来存储文本文件项 private void button9_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog1 = new OpenFileDialog(); open
private void button9_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Filter = "Text Files|*.txt";
openFileDialog1.Title = "Select a Text file";
openFileDialog1.FileName = "";
DialogResult result = openFileDialog1.ShowDialog();
if (result == DialogResult.OK)
{
string file = openFileDialog1.FileName;
string[] text = System.IO.File.ReadAllLines(file);
button9.Text = textBox13.Text.ToString();
textBox1.Text = string.Join("," + Environment.NewLine, text.Take(30));
if (text.Length > 30)
textBox2.Text = string.Join("," + Environment.NewLine, text[0]);
}
}
以下是一些可用于此目的的代码,解释如下:
string[] text = System.IO.File.ReadAllLines(file);
var thirtyLineSections = text
.Select((line, index) => new { line, group = index / 30 })
.GroupBy(item => item.group)
.ToArray();
int textboxIndex = 0;
foreach (var section in thirtyLineSections)
{
string textForSection = string.Join(",",
section.Select(item => item.line).ToArray()); // see note below
textboxes[textboxIndex].Text = textForSection;
textboxIndex++;
}
注意:如果您使用的是.NET 4.0或更高版本,则可以删除对.ToArray的调用,并将此行用于带有注释的一行:
section.Select(item => item.line));
那么,这段代码将做什么呢
首先,它将从原始文件中提取每一行,并通过.Select。。。方法此方法将获得一个基于0的索引和原始集合中的实际元素行。换句话说,Select方法的委托将被传递值0、第一行、1、第二行、2、第三行,依此类推。我们将其除以30得到一个组号,其中第一个组号为0,依此类推。然后,我们根据该组号分组,将具有相同组号的所有行放入同一组
换句话说,你得到了这个:
original file with index after dividing by 30
line 1 0,line 1 0,line 1
line 2 1,line 2 0,line 2
line 3 2,line 3 0,line 3
some text 3,some text 0,some text
line 5 4,line 5 0,line 5
...
line 30 29,line 30 0,line 30
line 31 30,line 31 1,line 31
因此,在LINQ查询中,我们将得到一个元素数组,其中每个元素都是一个组,包含原始文件中的30行文本,按照它们出现的顺序排列
然后我们在该数组上循环,一次处理30个元素,并使用string.Join将它们组合成一个字符串,将结果分配给一个文本框
在执行此代码之前,您需要执行以下操作:
var textboxes = new[]
{
textbox1,
textbox2,
...
textboxN
};
创建要将这些字符串指定给的文本框数组
注意:此代码不能确保您有足够的文本框。如果您在表单上删除了10个文本框,能够处理300个元素,并且该文件中有300多行,那么代码将抛出异常
好的,正如在一篇评论中指出的,LINQ查询看起来不错,但对于新程序员来说可能很难理解。我完全同意,所以这里有一个不同的方法来完成同样的事情:
string[] text = System.IO.File.ReadAllLines(file);
var thirtyLineSections = new List<List<string>>();
List<string> currentList = null;
foreach (string line in text)
{
if (currentList == null)
{
currentList = new List<string>();
thirtyLineSections.Add(currentList);
}
currentList.Add(line);
if (currentList.Count == 30)
currentList = null;
}
foreach (var section in thirtyLineSections)
{
string.Join(",", section).Dump();
}
那么这段代码将做什么呢
首先,它将创建数据结构,在本例中是一个包含30行列表的列表,即列表声明
然后它将遍历文件中的所有行。对于每一行,它将检查我们当前是否在一个组中,并且我们开始时不是在一个组中,因此答案是否,然后我们将创建一个新组并将其添加到列表中
然后我们继续用项目填充这个列表,直到它达到30个项目,然后我们简单地说ok,这样这个组就完成了,我们不再是那个组了。该循环处理的下一行将通过if语句再次为下一项和后续项添加新组。问题是?如何将文本文件项显示到10个不同的文本框中,每个文本框包含文本文件中的30行,用逗号分隔@Lasse V.KarlsenSo你的问题是,如何将一个包含多行/多行的文本文件分成30行的部分,然后将每个部分分配给自己的文本框?是的,确切地说@Lasse V.Karlsen将文本文件分成30行,并将每个部分分配给文本框。你在哪里卡住了?你试过什么?如果代码正确,ReadAllLines似乎会返回一个字符串数组。您可以遍历数组并将30行放入字符串中,以此类推。如果你陷入困境,你可以在这里问。我喜欢你使用LINQ和匿名函数的代码-我的upvote。但对于没有经验的用户来说,这可能很难理解。非常感谢。@拉塞诉卡尔森