gpt4 book ai didi

c# - 如何将多个 TextReader 串在一起?

转载 作者:太空狗 更新时间:2023-10-29 23:19:04 28 4
gpt4 key购买 nike

我有 3 个 TextReader——StreamReader 和 StringReader 的组合。从概念上讲,它们的串联是一个单一的文本文档。

我想调用一个采用单个 TextReader 的方法(不受我的控制)。是否有任何内置或简单的方法可以从多个 TextReader 中创建一个串联的 TextReader?

(我可以编写自己的 TextReader 子类,但看起来工作量很大。在那种情况下,我只需将它们全部写到一个临时文件中,然后使用单个 StreamReader。)

有没有我缺少的简单解决方案?

最佳答案

我只是把它放在一起,所以它不是 super 健壮(没有错误处理等),但基本测试用例有效。

它的工作原理是为 TextReader 创建一个扩展方法,这需要一秒钟,并返回一个新的 TextReader 类,该类在第一次内部调用 Read() 直到它用完,然后在第二个开始调用 Read()。您可以无限期地链接它。

要提供 TextReader 的完整实现,您只需实现 Read()Peek()Close() Dispose()。所有其他方法都依赖于特定的实现 Read() 来工作。因此,创建您自己的 TextReader 并不是那么糟糕,如下所示。

这也减轻了任何性能问题,因为我们只是包装现有的 TextReader 而不是实际调用它们来执行串联。

class Program
{
static void Main(string[] args)
{
StringReader first = new StringReader("hello ");
StringReader second = new StringReader("world");
StringReader third = new StringReader("!");

using (var allOfThem = first.Concat(second).Concat(third))
{
//writes "hello world!"
Console.WriteLine(allOfThem.ReadToEnd());
}
Console.Read();
}
}

public static class Extensions
{
public static TextReader Concat(this TextReader first, TextReader second)
{
return new ChainedTextReader(first, second);
}

private class ChainedTextReader : TextReader
{
private TextReader first;
private TextReader second;
private bool readFirst = true;

public ChainedTextReader(TextReader first, TextReader second)
{
this.first = first;
this.second = second;
}

public override int Peek()
{
if (readFirst)
{
return first.Peek();
}
else
{
return second.Peek();
}
}

public override int Read()
{
if (readFirst)
{
int value = first.Read();
if (value == -1)
{
readFirst = false;
}
else
{
return value;
}
}
return second.Read();
}

public override void Close()
{
first.Close();
second.Close();
}

protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
{
first.Dispose();
second.Dispose();
}
}
}
}

关于c# - 如何将多个 TextReader 串在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2925652/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com