4

我有以下代码:

StringReader contentReader = new StringReader(this.dataContent.ToString());

解析 DataContent 后,我​​需要将 contentReader 的位置重置为字符串的开头。我该怎么做?我在 StringReader 中没有看到设置位置选项

4

4 回答 4

9

将其设置为 StringReader 的新实例。我不相信您可以更改现有位置的位置。

contentReader = new StringReader(this.dataContent.ToString());

于 2014-06-04T21:16:48.403 回答
3

另一种选择是将字符串加载到 aMemoryStream然后使用 aStreamReader对其进行迭代。 MemoryStream绝对支持内存流上的位置重置。

String data = "Hello! My name it Inigo Montoya.";
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(data)))
{
    using (StreamReader reader = new StreamReader(stream))
    {
        // Do your parsing here using the standard StreamReader methods.
        // They should be fairly comparable to StringReader.

        // When all done, reset stream position to the beginning.
        stream.Seek(0, SeekOrigin.Begin);
    }
}
于 2014-06-04T23:21:26.213 回答
2

intStringReader 使用名为 的私有字段跟踪其在字符串中的位置_pos,如果要重置它,可以使用如下简单的扩展方法:

public static void Reset(this StringReader reader)
{
    reader.GetType()
          .GetField("_pos", BindingFlags.NonPublic | BindingFlags.Instance)
          .SetValue(reader, 0);
}

和一个测试方法:

[Test]
public void Reset()
{
    const string random = "this is a test string";
    using(var reader = new StringReader(random))
    {
        Assert.AreEqual(random, reader.ReadToEnd());
        Assert.IsEmpty(reader.ReadToEnd());

        reader.Reset();
        Assert.AreEqual(random, reader.ReadToEnd());
        Assert.IsEmpty(reader.ReadToEnd());
    }
}
于 2018-05-01T08:45:10.950 回答
-1

另请参阅类似问题: How do you reset a C# .NET TextReader cursor back to the start point?

但正如马修所说,解决方案可能是简单地创建一个新的。

于 2014-06-04T21:21:20.993 回答