Вопрос

У меня есть 3 Textreaders - комбинация страбаты и стружки. Концептуально концепция их представляет собой один текстовый документ.

Я хочу назвать методом (не под моим контролем), который принимает один текстур. Есть ли встроенный или простой способ сделать объединение Textreader из нескольких текстуров?

мог Напишите свой собственный подкласс Textreader, но он выглядит как справедливое количество работы. В этом случае я просто написал их все в файл TEMP, а затем откройте его одним потоком.)

Есть ли простое решение для этого, что мне не хватает?

Это было полезно?

Решение

Я только что бросил это вместе, так что это не супер-надежный (без обработки ошибок и т. Д.), Но базовый тестовый случай работает.

Это работает, создавая метод расширения для TextReaderЭто заняло секунду и возвращает новый класс Textreader, который внутренне звонит Read() на первом месте, пока он не закончится, а затем начинает звонить Read()На втором. Вы можете цеплять это бесконечно.

Обеспечить полную реализацию TextReader Вам нужно только реализовать Read(), Peek(), Close() а также Dispose(). Отказ Все остальные методы полагаются на конкретную реализацию Read() работать. Так что создавать свой собственный 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();
            }
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top