Хочешь что-то сделать - сделай это сам. Сказано - сделано. В итоге появился класс StringStream, который стал "в пригодi" уже не один раз. Класс полностью продокументирован комментариями и думаю вопросов возникнуть не должно. Ведь все гениальное просто!
Ниже привожу лишь интерфейс класса, так как по техническим причинам нельзя вывести текст полностью. Но его должно хватить, чтобы показать возможности для работы со строкой, как с потоком данных. Полный исходник вы всегда сможете скачать по ссылке в конце поста.
/**
*StringStream - утилитный класс для
работы со строками,
*как с потоком данных.
*Является усовершенствованным
вариантом StringReader.
*
*Автор: Шихов А.А. aka S.a.T.
*
*Класс является частью проекта
Extension-Project
* http://extension-project.blogspot.com
*но может использоваться и как
самостоятельная единица.
*
*Разрешается использование в
любых проектах,
*в том числе и коммерческих.
*При использовании ссылка на
сайт первоисточник и указание
автора обязательно.
*
*Класс поставляется "КАК ЕСТЬ".
Автор не несет никакой
ответственности
*за возможный ущерб, который
может быть нанесен при
использовании данного класса.
*
*Версия 1.0.0
*Дата: 05.10.2009
*
*/
using System;
using System.Text;
using System.Collections.Generic;
namespace Extension.Utils
{
/// <summary>
/// Класс для работы со строкой
как с потоком данных.
/// Является альтернативой
StringReader с рядом полезных
методов.
/// </summary>
class IStringStream
{
/// <summary>
/// Получение исходной строки
/// </summary>
public string Source
{
get
{
return source;
}
}
/// <summary>
/// Получение или установка
текущей позиции символа.
/// Неправильные значения
игноррируются.
/// </summary>
public int Position
{
get;
set;
}
/// <summary>
/// Установка разделитей по
умолчанию:
/// пробел, знак таубляции,
знак перевода каретки
/// </summary>
public void SetSeparators();
/// <summary>
/// Установка
пользовательских
разделитей.
/// Текущие разделители будут
удалены
/// </summary>
/// <param name="newSeparators"></param>
public void SetSeparators(string newSeparators);
/// <summary>
/// Добавление разделителей к
текущим.
/// </summary>
/// <param name="separators"></param>
public void AddSeparators(string newSeparators);
/// <summary>
/// Получение разделитей в
формате строка.
/// </summary>
/// <returns></returns>
public string GetSeparators();
/// <summary>
/// Флаг, показывающий
прочитана ли вся строка
/// Для сброса воспользуйтесь
свойством Position,
/// установив его в 0
/// </summary>
public bool EndOfStream
{
get;
}
/// <summary>
/// Единственный конструктор.
Параметр со строкой
источником обязятелен.
/// </summary>
/// <param name="text"> не нулевая и не
пустая строка</param>
public StringStream(string text);
/// <summary>
/// Получение следующего
символа,
/// без сдвига указателя
текущего символа
/// </summary>
/// <returns>следующий символ, или
Char.MaxValue если EndOfStream = true</returns>
public char Peek();
/// <summary>
/// Перемещение указателя
текущего символа на первый
символ не-разделитель
/// Если разделитель не
находится, то текущая
позиция устанавливается за
последний символ
/// </summary>
public void SkipSeparators();
/// <summary>
/// Проверка на наличие
символа в списке
разделителей
/// </summary>
/// <param name="ch"></param>
/// <returns></returns>
private bool IsCharInSeparators(char ch);
/// <summary>
/// Чтение до конца строки,
исключая все разделители
/// </summary>
/// <returns></returns>
public string ReadAllExceptSeparators();
/// <summary>
/// Получение следующего
символа не-разделителя
/// </summary>
/// <param name="ch">следующий символ
не-разделитель, или
Char.MaxValue если EndOfStream<
/param>
/// <returns>true - если удалось
прочитать, false если
достигнут конец строки</returns>
public bool ReadChar(out char ch);
/// <summary>
/// Получение следующего
символа.
/// </summary>
/// <param name="skipSeparators">флаг,
который при
значении true
отменяет пропуск
символов
разделителей</param>
/// <returns>следующий символ или
Char.MaxValue если достигнут конец
строки</returns>
public char ReadChar(bool skipSeparators);
/// <summary>
/// Получение следующего
символа с пропуском
разделителей
/// </summary>
/// <returns></returns>
public char ReadChar();
/// <summary>
/// Чтение до указанного
символа или конца строки
игноррируя заданные
разделители
/// </summary>
/// <param name="ch">символ, до
которого читать из
строки</param>
/// <param name="str">строка
результат, не
включающая символ,
переданный первым
параметром метода<
/param>
/// <returns>прочитанную строку
или null, если EndOfStream = true</returns>
public bool ReadToChar(char ch, out string str);
/// <summary>
/// Читать с первого символа
не-разделителя до
следующего разделителя, не
включая его
/// </summary>
/// <returns>строка до следующего
разделителя, или null если
EndOfStream = true</returns>
public string Read();
}
}
Исходник можно скачать здесь: StringStream.cs