如何将String Reader中的位置重置为String的开头?

时间:2014-06-04 21:12:46

标签: c# stringreader

我有以下代码:

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

在我解析DataContent之后,我需要重置contentReader的poistion以开始字符串。我该怎么做?我在StringReader

中没有看到set poistion选项

4 个答案:

答案 0 :(得分:8)

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

  

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

答案 1 :(得分:2)

另一种选择是将字符串加载到MemoryStream然后使用StreamReader迭代它。 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);
    }
}

答案 2 :(得分:1)

StringReader使用名为int的私有_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());
    }
}

答案 3 :(得分:-1)

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

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