我试图从文件中获取特定的行并将它们放在另一个字符串中,或者如果我们可以将它放在另一个文本框中,它就不会是一个问题:P
string[] msglines;
msglines = System.IO.File.ReadAllLines(@"C:\\Users\xA\Desktop\MESSAGES.txt");
for (int x = 0; x < msglines.Length; x++)
{
this.textBox5.Text = msglines[c];
c = c + 2;
}
我得到了: 索引超出了数组的范围。
答案 0 :(得分:7)
如果你想得到每一行。
将循环更改为
//Odd Lines
for (int x = 0; x < msglines.Length; x = x + 2)
{
this.textBox5.Text += msglines[x];
}
//Even Lines
for (int x = 1; x < msglines.Length; x = x + 2)
{
this.textBox5.Text += msglines[x];
}
正如评论中指出的那样,您可以将x = x + 2
缩短为x += 2
为了LinqY Goodness的利益......
//ODDS
msgLines
.Where((str, index) => index % 2 == 0)
.ToList()
.ForEach(str => textBox1.Text += String.Format("{0}\r\n", str));
//EVENS
msgLines
.Where((str, index) => index % 2 == 1)
.ToList()
.ForEach(str => textBox1.Text += String.Format("{0}\r\n", str));
答案 1 :(得分:3)
你的循环由x控制,但是你要用c进行索引[因此你需要逻辑来防止c变得大于数组的大小]
答案 2 :(得分:3)
因为您每次都将行索引(c
)增加2;只需使用x
:
this.textBox5.Text = msglines[x];
当然,从循环开始,这将导致显示最后一行。你实际想要展示的是哪一行?
编辑评论;在这种情况下,简单地说:
StringBuilder sb = new StringBuilder();
for (int x = 1; x < msglines.Length; x+=2)
{
sb.AppendLine(msglines[x]);
}
this.textBox5.Text = sb.ToString();
答案 3 :(得分:2)
在你的for循环中,你正在使用c。你需要使用x。我可以建议您查看reference for for。
试试这个......
string[] msglines;
msglines = System.IO.File.ReadAllLines(@"C:\\Users\xA\Desktop\MESSAGES.txt");
for (int x = 0; x < msglines.Length; x++)
{
this.textBox5.Text = msglines[x];
}
答案 4 :(得分:1)
然后你应该使用X作为索引,步长为2,而不是1。
答案 5 :(得分:1)
为简单起见,我将使用从字符串中获取每个其他字符的示例,但是从字符串数组中获取每个其他行的情况类似。
让我们以“Hello”作为你的msglines字符串的例子
(来源:javabat.com)
让我们说你的全局变量c i在你进入for循环之前初始化为0。你的msglines.Lenght将是5.在循环的第四次迭代(x == 3)中,你将尝试访问msglines [6],它超出了数组的范围,因此出错。
你可能想要一些
的内容int x = 0;
while(x <= msglines.Lenght){
this.textBox5.Text += msglines[x];
x = x + 2;
}
或
for(x=0; x <= msglines.Lenght ; x+=2){
this.textBox5.Text += msglines[x];
}
要获得奇数行,您将从x初始化为1开始。
至于上面两个完全等效的版本中的哪一个,我建议使用一个更易读的版本。根据我的经验,这总是更好的选择。
答案 6 :(得分:1)
试试这个
string[] msglines;
msglines = System.IO.File.ReadAllLines(@"C:\Users\xA\Desktop\MESSAGES.txt");
for (int x = 0; x < msglines.Length; x++)
{
this.textBox5.Text = msglines[x++];
}
答案 7 :(得分:1)
你说你想要TextBox中的所有奇数行,但你的循环只显示最后一行,因为你在每次传递时都会覆盖内容。
显示所有奇数行,以换行符分隔:
string lineSep = "";
for (int x = 0; x < msglines.Length; x += 2)
{
this.textBox5.Text += lineSep + msglines[x];
lineSep = "\r\n";
}
答案 8 :(得分:0)
ReadAllLines()
调用中有一个双反斜杠,导致无法打开文件。
此外,您使用c
作为数组索引,看起来您想要x
答案 9 :(得分:0)
我写的代码正是我想要的......
我实际上希望将我文件中的每个奇数行发送到文本框。是的P.S C从1开始初始化
答案 10 :(得分:0)
除了已经提到的c
与x
的索引问题之外,您还会在每次迭代时覆盖textBox5.Text
,因此您只会看到最后一行。似乎不太可能是预期的行为。你可能想要这样的东西:
this.textBox5.Text += msglines[x]; // note x instead of c
或者,如果你真的想要一切并且+2本身就是一个错字,你可以在没有任何循环的情况下做到这一点:
this.textBox5.Text = String.Join( "\n", msglines );
答案 11 :(得分:0)
以下函数将返回一个IEnumerable,它在文件中给出奇数行:
private IEnumerable<string> GetOddLines(string fileName)
{
string[] lines = File.ReadAllLines(fileName);
IEnumerator allLines = lines.GetEnumerator();
while (allLines.MoveNext())
{
yield return (string)allLines.Current;
if (!allLines.MoveNext())
{
break;
}
}
}
如果你想要偶数行,只需在while循环之前添加对allLines.MoveNext()的调用。
答案 12 :(得分:0)
您需要使用Length -1循环数组。 45长度数组仅索引到44。