Ken*_*Ken 5 c# concatenation streamreader textreader stringreader
我有3个TextReaders - StreamReaders和StringReaders的组合.从概念上讲,它们的串联是单个文本文档.
我想调用一个带有单个TextReader的方法(不在我的控制之下).是否有任何内置或简单的方法可以从多个TextReader中连接TextReader?
(我可以编写自己的TextReader子类,但看起来工作量相当大.在这种情况下,我只需将它们全部写入临时文件,然后使用单个StreamReader打开它.)
有一个简单的解决方案,我错过了吗?
我只是把它放在一起,所以它不是超级健壮(没有错误处理等),但基本的测试用例有效.
它的工作原理是创建一个延迟方法TextReader,花费一秒钟,并返回一个新的TextReader类,它在内部调用Read()第一个直到它用完,然后开始调用Read()第二个.你可以无限期地链接这个.
为了提供完整的实现TextReader,你只需要实现Read(),Peek(),Close()和Dispose().所有其他方法都依赖于特定的实现Read()来工作.所以创建你自己TextReader真的不是那么糟糕,你可以在下面看到.
这也减轻了任何性能问题,因为我们只是包装现有的TextReaders而不是实际调用它们来执行连接.
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();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)