C # /. NET: переформатирование очень длинной строки - PullRequest
0 голосов
/ 24 июня 2011

Мне нужно прочитать строку, символ за символом, и построить новую строку в качестве вывода.

Какой лучший подход сделать это в C #?

Использовать StringBuilder? Использовать какой-нибудь писатель / стрим?

Обратите внимание, что операций ввода-вывода не будет - это строго преобразование в памяти.

Ответы [ 6 ]

5 голосов
/ 24 июня 2011

Если размер строки не может быть определен во время компиляции, и он также может быть относительно большим, вы должны использовать StringBuilder для объединения, так как он действует как изменяемая строка.

var input = SomeLongString;

// may as well initialize the capacity as well
// as the length will be 1 to 1 with the unprocessed input.
var sb = new StringBuilder( input.Length );
foreach( char c in input )
{
    sb.Append( Process( c ) );
}
2 голосов
/ 24 июня 2011

если это только одна строка, вы можете использовать коллекцию для хранения ваших символов, а затем просто создать строку с помощью конструктора:

IEnumerable<char> myChars = ...;
string result = new string(myChars);

Используя Linq и с помощью метода ProcessChar(char c), который преобразует каждый символ в его выходное значение, это может быть просто преобразованием запроса (с использованием строкового конструктора, который принимает IEnumerable<char> в качестве входных данных):

string result = new string(sourceString.Select(c => ProcessChar(c)));

Это так же эффективно, как использование StringBuilder (поскольку StringBuilder используется внутри класса string для построения строки из IEnumerable), но, на мой взгляд, гораздо более читабельно.

0 голосов
/ 24 июня 2011
void Main()
{
    string myLongString = "lf;kajsd;lfkjal;dfkja;lkdfja;lkdjf;alkjdfa";

    var transformedTString = string.Join(string.Empty, myLongString.ToCharArray().Where(x => x != ';'));

    transformedTString.Dump();
}

Если у вас более сложная логика, вы можете перенести свою проверку в отдельный предикатный метод

void Main()
{
    string myLongString = "lf;kajsd;lfkjal;dfkja;lkdfja;lkdjf;alkjdfa";

    var transformedTString = string.Join(string.Empty, myLongString.ToCharArray().Where(MyPredicate));

    transformedTString.Dump();
}

public bool MyPredicate(char c)
{
    return c != ';';
}
0 голосов
/ 24 июня 2011

В чем разница между прочитанной строкой и выходной строкой? Я имею в виду, почему вы должны читать символ за символом?

Я использую этот метод для чтения строки

string str = "some stuff";
string newStr = ToNewString(str);


string ToNewString(string arg)
{
   string r = string.Empty;
   foreach (char c in arg)
      r += DoWork(c);
   return r;
}

char DoWorK(char arg)
{
    // What do you want to do here?
}
0 голосов
/ 24 июня 2011

A StringBuilder - хорошая идея для построения новой строки, потому что вы можете эффективно добавлять к ней новые значения.Что касается чтения символов из входной строки, StringReader будет достаточным выбором.

0 голосов
/ 24 июня 2011

Stringbuilder, как правило, довольно хорошая ставка. Я написал много javascript на веб-страницах, используя его.

...