Что-то вроде этого может быть:
var csv = @"A, 22, 23, 12
B, 32, 4, 33
C, 34, 3 ,33";
var lines =
csv.Split('\n').Select(x => x.Split(',').Skip(1).Select(n => int.Parse(n))).Select(x => new {Sum = x.Sum(), Average = x.Average()});
foreach (var line in lines)
{
Console.WriteLine("Sum: " + line.Sum);
Console.WriteLine("Average: " + line.Average);
}
В общем, я не предлагаю делать что-то подобное. Вы должны использовать полнофункциональный CSV-ридер для анализа CSV-файла, и вам следует включить обработку ошибок.
Это то, для чего предназначен StringBuilder . Если вам предстоит много манипуляций, сделайте это на StringBuilder
, а затем превратите его в String
всякий раз, когда вам нужно.
StringBuilder
- это описывается так:
«Изменяемая последовательность символов. Этот класс предоставляет API, совместимый со StringBuffer, но без гарантии синхронизации».
Он имеет replace
(и append
], вставить
, удалить
и др.), И вы можете использовать toString
, чтобы преобразовать его в реальную строку
.
The previous posts are right, StringBuilder/StringBuffer are a solution.
But, you also have to question if it is a good idea to do the replace on big Strings in memory.
I often have String manipulations that are implemented as a stream, so instead of replacing it in the string and then sending it to an OutputStream, I do the replace at the moment that I send the String to the outputstream. That works much faster than any replace.
This works much faster if you want this replace to implement a template mechanism. Streaming is always faster since you consume less memory and if the clients is slow, you only need to generate at a slow pace - so it scales much better.
Все операции со строками в целом очень медленные. Подумайте об использовании StringBuffer, он не совсем похож на класс String, но имеет много общего, а также изменяемый.
Я согласен с вышеизложенным. Используйте StringBuffer для обеспечения безопасности потоков и StringBuilder при работе с отдельными потоками.