Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как эффективно вставлять слово в текст 
:(
    Опции темы
derek
Дата 31.8.2006, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 16.7.2006

Репутация: нет
Всего: нет



вообщем такая задача. Есть слово(string) и richTextBox1 уже забитый текстом. Задача - вставить слово в текст в нужной поцизии (ну там где курсор ввода)..

я делаю так. разбиваю текст на части. От начала текста до слова, потом само слово, и от конца слова до конца текста. И забиваю в richTextBox - это работает но если вбитый текст большой, то процесс добавления слова в текст протекает довольно медленно. Вопрос - как эффективно вставлять слово в текст, так чтобы это протекало максимально быстро..особенно желательно с примерами. Большое спасибо.

да и еще - вот на всякий случай мой код..

Код


                string typed="";

                int prefixend = richTextBox1.SelectionStart - typed.Length;
                int suffixstart = richTextBox1.SelectionStart + typed.Length;

                if (suffixstart >= richTextBox1.Text.Length)
                {
                    suffixstart = richTextBox1.Text.Length;
                }

                string prefix = richTextBox1.Text.Substring(0, prefixend);


                string fill = listBox1.SelectedItem.ToString();


                string suffix = richTextBox1.Text.Substring(suffixstart, this.richTextBox1.Text.Length - suffixstart);

                richTextBox1.Text = prefix + fill + suffix;
                richTextBox1.SelectionStart = prefix.Length + fill.Length;


PM MAIL   Вверх
ivashkanet
Дата 31.8.2006, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



derek, есть специальный метод Insert 
 
Код

string str = "Привет derek";
str = str.Insert(6, ",");


Это сообщение отредактировал(а) ivashkanet - 31.8.2006, 09:25
PM MAIL WWW ICQ   Вверх
derek
Дата 31.8.2006, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 16.7.2006

Репутация: нет
Всего: нет



ivashkanet, конечно этот Insert гораздо компактнее чем то, как делал я. Но по скорости как ни странно они примерно одинаковы. Может есть какой нить другой способ?
PM MAIL   Вверх
ivashkanet
Дата 31.8.2006, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(derek @  31.8.2006,  12:45 Найти цитируемый пост)
Но по скорости как ни странно они примерно одинаковы.

Не может быть. В нем используется другой подход к работе со строками, возможно Unmanaged код, а может что-нить еще круче. В общем:
Код
[MethodImpl(MethodImplOptions.InternalCall)]-
public extern string Insert(int startIndex, string value);


P.S. Можно посмотреть в сторону класса StringBuilder.

PM MAIL WWW ICQ   Вверх
ivashkanet
Дата 31.8.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Провел краш-тест:
Код

            string str= "";
            string oridginalStr = str.PadLeft(1000000, 'A');
            string insertedStr = str.PadLeft(1000, 'B');
            string resultedStr="";


            DateTime startTime = DateTime.Now;
            for (int i = 0; i < 1000; i++)
            {
                resultedStr = oridginalStr.Insert(1000, insertedStr);
            }
            
            Console.WriteLine(((TimeSpan)(DateTime.Now - startTime)).Seconds);
           
            startTime = DateTime.Now;
            for (int i = 0; i < 1000; i++)
            {
                string prefix = oridginalStr.Substring(0, 1000);

                string suffix = oridginalStr.Substring(1000, oridginalStr.Length - 1000);

                resultedStr = prefix + insertedStr + suffix;
            }

            Console.WriteLine(((TimeSpan)(DateTime.Now - startTime)).Seconds);
            Console.ReadKey();


Исходный текст: миллион букв А, вставляемый: тысяча букв В, позиция вставки: 1000.
Число прогонов: 1000
Результаты: 
insert --- 6-7 сек.
склейка --- 13-15 сек.

Итог: выигрышь 50% --- очень даже не плохой результат. Не стоит сильно заморачиваться в скорости, комп итак неплохо справляется с этой операцией.
PM MAIL WWW ICQ   Вверх
derek
Дата 16.10.2006, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 16.7.2006

Репутация: нет
Всего: нет



опять вернулся к этой теме..
например у меня на форме расположен richtextbox и кнопка с таким кодом

Код

richTextBox1.Text.Insert(richTextBox1.SelectionStart, "привет");



в результате - не работает smile что я не так делаю?
PM MAIL   Вверх
Exception
Дата 17.10.2006, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Строки в .NET неизменяемы. Это значит, что любой метод класса System.String возвратит новую строку, не затронув данные той, к которой он был применён.
Код
richTextBox1.Text = richTextBox1.Text.Insert(richTextBox1.SelectionStart, "привет");

PM   Вверх
derek
Дата 17.10.2006, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 16.7.2006

Репутация: нет
Всего: нет



Exception,  ок все получилось..

назревает новый вопрос...как реализовать чтобы после добавления в готовый текст слова, каретка устанавливалась бы не на начало текста, а сразу после добавленного слова

Это сообщение отредактировал(а) derek - 17.10.2006, 01:55
PM MAIL   Вверх
ivashkanet
Дата 17.10.2006, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(derek @  17.10.2006,  01:48 Найти цитируемый пост)
как реализовать чтобы после добавления в готовый текст слова, каретка устанавливалась бы не на начало текста, а сразу после добавленного слова

Запоминай место где она была и добавляй к нему длинну вставляемого текста, а потом переставляй курсор на эту позицию
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0495 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.