c#10文本框显示数组项,每个文本框中有30行,用逗号分隔

时间:2014-04-05 17:58:05

标签: c# .net arrays string

我在按钮点击上有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]);
        }
}

1 个答案:

答案 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语句再次为下一个(及后续)项添加一个新组。