当我使用StringReader.ReadLine从字符串数组中读取文本时,它会完美地读取它,但它也会清除我的数组,
using (StringReader reader = new StringReader(filesGroupList[x]))
{
while ((filesGroupList[x] = reader.ReadLine()) != null)
{
...
}
}
现在,filesGroupList为空。所以,如果我想再次从这个字符串读取数据,它会给我空引用异常,所以对我来说唯一的方法是在使用ReadLine之前创建这个数组的副本,但是有可能避免它吗?所以当StringReaded完成读取行时,我的行仍然在数组内部。
答案 0 :(得分:1)
鉴于您编写的代码,这里是我看到它的一个例子:
//going to set filesGroupList[x] to a string and then see what happens.
filesGroupList[x] = "First line of string.\nSecond line of string.\n";
//now we go into the using portion.
using (StringReader reader = new StringReader(filesGroupList[x]))
{
//reader has access to the whole string.
while ((filesGroupList[x] = reader.ReadLine()) != null)
{
//first time through, filesGroupList[x] is set to "First line of string."
//second time through, filesGroupLIst[x] is set to "Second line of string."
Console.WriteLine(filesGroupList[x]);
}
//third time through, ReadLine() returns null.
//filesGroupList[x] is set to null.
//Code breaks out of while loop.
Console.WriteLine(filesGroupList[x]); //outputs an empty line.
}
//outside of using, filesGroupList[x] still null.
Console.WriteLine(filesGroupList[x]); //also outputs an empty line.
现在,根据我建议使用line的其他答案,除了行部分外,我们将保持一致。
//going to set filesGroupList[x] to a string and then see what happens.
filesGroupList[x] = "First line of string.\nSecond line of string.\n";
using (StringReader reader = new StringReader(filesGroupList[x]))
{
//reader has access to the whole string.
string line;
while ((line = reader.ReadLine()) != null)
{
//first time through, line is set to "First line of string."
//second time through, line is set to "Second line of string."
Console.WriteLine(line);
}
//third time through, ReadLine() returns null.
//line is set to null.
//filesGroupList[x] is still set to "First line of string.\nSecond line of string.\n"
Console.WriteLine(line); //outputs an empty line.
Console.Write(filesGroupList[x]); //outputs whole string (on 2 lines).
}
Console.WriteLine(line); //won't compile. line doesn't exist.
Console.Write(filesGroupList[x]); //outputs whole string (on 2 lines).
所以我认为您不想阅读filesGroupList[x]
,然后将其存储在filesGroupList[x]
中。如果filesGroupList[x]
中的字符串没有行尾字符,则只需将该字符串放回其中(然后通过null
循环将while
放入下一次)。如果filesGroupList[x]
中的字符串确实包含行尾字符,那么每次通过while
循环时,您都会将字符串的一部分放回filesGroupList[x]
,我认为不是你的意图。
答案 1 :(得分:0)
修改强>
确实在using语句之后,字符串为空,因此可以预期:
StringReader.Dispose:释放TextReader对象使用的所有资源。 (继承自TextReader。)
问题是为什么你想要这样做,你想做什么似乎不合理。没有更多的上下文信息就没有。
你的代码功能完美,或者你无法解释自己,或者你的问题是完全不相关的。
我只是尝试了自己:
static void Main(string[] args)
{
string[] filesGroupList = new string[1];
int x = 0;
filesGroupList[x] = "String is here!";
using (StringReader reader = new StringReader(filesGroupList[x]))
{
while ((filesGroupList[x] = reader.ReadLine()) != null)
{
Console.WriteLine("the string is here, I just checked");
Console.WriteLine(filesGroupList[x]);
}
}
Console.ReadLine();
}
输出:
字符串在这里,我刚检查了
字符串在这里!
答案 2 :(得分:-1)
我认为你的错误就在这里:
while ((filesGroupList[x] = reader.ReadLine()) != null)
您每次阅读和最后一次更改filesGroupList[x]
的值,并将其设置为null
。
如果相反,你做了类似的事情:
string line;
while ((line = reader.ReadLine()) != null)
...
然后,一旦你不在使用中,你会发现filesGroupList[x]
没有变化。