Ответ 1
Для чего стоит, вот неизменная реализация Java. Вероятно, вы могли бы преобразовать его в С# менее чем за час.
Существует ли публичная реализация структуры данных Rope в С#?
Для чего стоит, вот неизменная реализация Java. Вероятно, вы могли бы преобразовать его в С# менее чем за час.
Я не знаю о внедрении Rope (хотя, вероятно, есть один!), но если вы только после выполнения конкатенации, StringBuilder выполнит эту работу.
Класс BigList<T>
из коллекции Wintellect Power Collections (библиотека структуры данных С#) как-то похож на веревку:
http://docs.pushtechnology.com/docs/4.5.7/dotnet/externalclient/html/class_wintellect_1_1_power_collections_1_1_big_list_3_01_t_01_4.html
Я измерил его производительность, и он отлично справляется с "началом вставки строк":
const int InsertCount = 150000;
var startTime = DateTime.Now;
var ropeOfChars = new BigList<char>();
for (int i = 0; i < InsertCount; i++)
{
ropeOfChars.Insert(0, (char)('a' + (i % 10)));
}
Console.WriteLine("Rope<char> time: {0}", DateTime.Now - startTime);
startTime = DateTime.Now;
var stringBuilder = new StringBuilder();
for (int i = 0; i < InsertCount; i++)
{
stringBuilder.Insert(0, (char)('a' + (i % 10)));
}
Console.WriteLine("StringBuilder time: {0}", DateTime.Now - startTime);
Результаты:
Rope<char> time: 00:00:00.0468740
StringBuilder time: 00:00:05.1471300
Но он плохо работает в "середине вставки строк":
const int InsertCount = 150000;
var startTime = DateTime.Now;
var ropeOfChars = new BigList<char>();
for (int i = 0; i < InsertCount; i++)
{
ropeOfChars.Insert(ropeOfChars.Count / 2, (char)('a' + (i % 10)));
}
Console.WriteLine("Rope<char> time: {0}", DateTime.Now - startTime);
startTime = DateTime.Now;
var stringBuilder = new StringBuilder();
for (int i = 0; i < InsertCount; i++)
{
stringBuilder.Insert(stringBuilder.Length / 2, (char)('a' + (i % 10)));
}
Console.WriteLine("StringBuilder time: {0}", DateTime.Now - startTime);
Результаты:
Rope<char> time: 00:00:15.0229452
StringBuilder time: 00:00:04.7812553
Я не уверен, что это ошибка или неэффективная реализация, но ожидается, что "rope of chars
" будет быстрее, чем StringBuilder
в С#.
Вы можете установить Power Collections из NuGet:
Install-Package XAct.Wintellect.PowerCollections