Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C10文本框,用于显示数组项,每个文本框中有30行,用逗号分隔_C#_.net_Arrays_String - Fatal编程技术网

C# C10文本框,用于显示数组项,每个文本框中有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

我有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]);
        }
}

以下是一些可用于此目的的代码,解释如下:

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。但对于没有经验的用户来说,这可能很难理解。非常感谢。@拉塞诉卡尔森