我在按钮点击上有10个不同的文本框控件和文本文件上传脚本。我希望当用户上传一个可能包含300行的文本文件时,它会被分成10个不同的文本框,每个文本框中有30行,其中每行用逗号分隔。我使用数组来存储文本文件。
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]);
}
}
答案 0 :(得分:1)
以下是您可以使用的一些代码,解释如下:
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行列表”,即。 List<List<string>>
声明。
然后它将循环遍历文件中的所有行。对于每一行,它将检查我们当前是否在一个组中,并且我们从“不在一个组中”开始,所以答案是否定的,那么我们将创建一个新组并将其添加到我们的列表中。
然后我们继续用这些项目填充这个列表,直到它达到30个项目,然后我们简单地说“好吧,所以这个组已经完成,我们不再在那个组中”。此循环处理的下一行将通过if语句再次为下一个(及后续)项添加一个新组。