【问题标题】:How to reset position in StringReader to begining of String?如何将 StringReader 中的位置重置为字符串的开头?
【发布时间】:2014-06-04 21:12:46
【问题描述】:

我有以下代码:

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

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

【问题讨论】:

  • 只是出于好奇,为什么需要将其重新定位到开头?

标签: c# stringreader


【解决方案1】:

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

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

【讨论】:

    【解决方案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);
        }
    }
    

    【讨论】:

    • 必须在设置流位置后调用reader.DiscardBufferedData()msdn.microsoft.com/en-us/library/…
    • @StevenLiekens: reader.Flush() 是另一种选择。但是,只有在已写入流时才需要这两种方法。在这种情况下,不需要调用。
    • 没有StreamReader.Flush()。只有DiscardBufferedData()。你必须在寻找之后调用它,因为如果你不这样做,阅读器会在再次点击流之前读取任何缓冲的字节。
    【解决方案3】:

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

    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());
        }
    }
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-19
        • 2012-04-05
        • 1970-01-01
        • 1970-01-01
        • 2012-02-07
        • 2018-09-23
        • 1970-01-01
        相关资源
        最近更新 更多