Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
В поиске
103 / 51 / 17
Регистрация: 20.04.2014
Сообщений: 826

Замена текста

17.08.2016, 17:46. Показов 1146. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите как лучше производить замену одного текста на другой.


C#
1
Dictionary<int, string> Контейнер = new Dictionary<int, string>();
внутри
1 | текст 1
2 | текст 5
3 | текст 4
...

есть переменная

string text = "[1] что нить еще [3] потом еще что нить [2]"

Сейчас меняю через цикл
C#
1
2
3
4
foreach (var element in Контейнер)
                    {
                        text = text.Replace("["+element.Key+"]",element.Value); 
                    }
итог: "текст 1 что нить еще текст 4 потом еще что нить текст 5"

Работает так как надо но при Контейнер в более 300 уже ощутимо задумывается. При том что уже видно что все 300 переберать не надо когда в тексте всего 3 значения встретится.
Есть ли способ по быстрее производить замену при том что я знаю что изменяемое место заключено в квадратные скобки []

Добавлено через 14 минут
Есть еще идея через Split разобрать а потом собрать в обратном порядке
var yty = text.Split(new char[] { '[',']' });
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.08.2016, 17:46
Ответы с готовыми решениями:

Замена текста
Здраствуйте дорогие кодеры. Нужна ваша помощь. Мне нужно чтобы юзер ввел текст наприпер: &quot;Привет %name%. Как твои дела?&quot; и %name%...

Замена текста в строке
Есть файл с заменами (что на что заменить) и есть файл, в котором нужно менять, почему не неработает? static string Zamena(Pair...

Замена текста в pdf
Здравствуйте. Нужно по всему pdf файлу заменить пару слов например &quot;старая строка&quot; заменить на &quot;новая строчка&quot; после чего...

8
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
17.08.2016, 18:09
Попробуй так.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
 
namespace rele
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, string> dict = new Dictionary<string, string>()
            {
                {"1","Текст 1" },
                {"2","Текст 5" },
                {"3","Текст 4" }
            };
            string text = "[1] что нить еще [3] потом еще что нить [2]";
            string pattern = @"\[(?<key>\d+)\]";
 
            Regex re = new Regex(pattern);
            var result = re.Replace(text, m =>
            {
                return dict[m.Groups["key"].Value];
            });
 
            Console.WriteLine(result);
            Console.ReadKey();
        }
    }
}
1
В поиске
103 / 51 / 17
Регистрация: 20.04.2014
Сообщений: 826
17.08.2016, 19:06  [ТС]
diadiavova,

Странно по замерам вообще смешно получилось

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
                    Dictionary<string, string> dict = new Dictionary<string, string>()
                        {
                            {"1","Текст 1" },
                            {"2","Текст 5" },
                            {"3","Текст 4" }
                        };
                    string text = "[1] что нить еще [3] потом еще что нить [2]";
 
                    System.Diagnostics.Stopwatch swatch5 = new System.Diagnostics.Stopwatch(); // создаем объект
                    swatch5.Start();
                    string pattern = @"\[(?<key>\d+)\]";
 
                    Regex re = new Regex(pattern);
                    var result = re.Replace(text, m =>
                    {
                        return dict[m.Groups["key"].Value];
                    });
                    swatch5.Stop(); // стоп
 
 
                    System.Diagnostics.Stopwatch swatch6 = new System.Diagnostics.Stopwatch(); // создаем объект
                    swatch6.Start();
                    var yty = text.Split(new char[] { '[', ']' });
 
                    for (int i = 0, Length = yty.Length; i < Length; i++)
                    {
                        int num;
                        if (int.TryParse(yty[i], out num))
                        {
                            yty[i] = dict[num.ToString()];
                        }
                    }
                    string s10 = string.Join("", yty);
                    swatch6.Stop(); // стоп
 
 
                    var uu = swatch5.Elapsed; // выводим результат в консоль
                    var uu1 = swatch6.Elapsed;
00:00:00.0004839
00:00:00.0000087

00:00:00.0000292
00:00:00.0000087

00:00:00.0000323
00:00:00.0000051

00:00:00.0000410
00:00:00.0000056

При первом старте вообще 4839
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
17.08.2016, 20:25
КВА696, ты упускаешь пару вещей, которые неплохо было бы иметь в виду. Ведь что ты написал вначале? Что использованный тобой алгоритм начинает тормозить при большом количестве элементов в словаре. Рискну предположить, что если при этом еще и текст будет достаточно большим, то тормоза будут еще более заметными. Почему так происходит? Да все очень просто: операция замены символов в тексте не такаю уж и дешевая и для того, чтобы ее осуществить надо проийтись по всему тексту. Теперь если у тебя в словаре туева хуча элементов, то эту операцию приходится выполнять для каждого из них, независимо от того, встречается он в тексте или нет.
Теперь рассмотрим, что происходит при использовании регулярного выражения. Из всего словаря используются только те элементы, которые реально встречаются в тексте, то есть весь словарь обходить не нужно. А текст обходится только один раз в любом случае. Таким образом, несмотря на то, что замена с помощью регулярки - несколько более ресурсоемкая операция чем простой реплейс(что и понятно), тем не менее при росте словаря и текста объем потребляемых ресурсов не будет расти лавинообразно. Таким образом тесты, проведенные на малых объемах, - некорректны. Я, конечно, не утверждаю, что этот способ тебе подойдет, но в теории - должен.
1
В поиске
103 / 51 / 17
Регистрация: 20.04.2014
Сообщений: 826
17.08.2016, 20:41  [ТС]
diadiavova,
Наверно всеже я гдето замеряю не правильно но даже при
C#
1
2
3
4
5
6
7
8
                string text = @"
[1] что нить еще [3] потом еще что нить [2]
[1] что нить еще [3] потом еще что нить [2]
[1] что нить еще [3] потом еще что нить [2]
[1] что нить еще [3] потом еще что нить [2]
[1] что нить еще [3] потом еще что нить [2]
[1] что нить еще [3] потом еще что нить [2]
.....
где 1,2 и 3 встречаются 2 352

старт программы
00:00:00.0027058
00:00:00.0189529

потом по нажатию на кнопку (почему то цифры кардинально меняются по сравнению со стартом программы)
00:00:00.0022353
00:00:00.0012977

00:00:00.0021465
00:00:00.0012669

Уточню. В выложеном примере сопоставления по времени мой случай не перебирать все элементы Dictionary<string, string> dict а разбиваю text.Split(new char[] { '[', ']' });
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
17.08.2016, 20:47
Цитата Сообщение от КВА696 Посмотреть сообщение
Наверно всеже я гдето замеряю не правильно но даже при
Ну отчего же неправильно? Ты всего-навсего немного увеличил объем текста, а разрыв уже сократился.Посмотри во сколько раз быстрее твой алгоритм работал раньше и во сколько сейчас. А теперь попробуй добавить в словарь побольше значений и это преимущество очень быстро улетучится.
1
В поиске
103 / 51 / 17
Регистрация: 20.04.2014
Сообщений: 826
17.08.2016, 21:06  [ТС]
Если интересно то dict увеличил до 30
а текст типо
Кликните здесь для просмотра всего текста
[1] что нить еще [3] потом еще что нить [2][4]
[1] что нить еще [3] потом еще что нить [2]
[5] что нить еще [6] потом [10]еще что нить [9][8]
[7][11] что нить еще [13] потом еще что нить [12][14]
[11] что нить еще [13] потом еще что нить [12]
[15] что нить еще [16] потом [20]еще что нить [19][18]
[17][21] что нить еще [23] потом еще что нить [22][24]
[21] что нить еще [23] потом еще что нить [22]
[25] что нить еще [26] потом [30]еще что нить [29][28]
[7][11] что нить еще [23] потом еще что нить [22][24]
[11] что нить еще [13] потом еще что нить [12]
[15] что нить еще [16] потом [20]еще что нить [19][18]
[1] что нить еще [3] потом еще что нить [2][4]
[1] что нить еще [3] потом еще что нить [2]
...

2687 строк

00:00:00.0297785
00:00:00.0060896

00:00:00.0111524
00:00:00.0200269

00:00:00.0140440
00:00:00.0067926

00:00:00.0143781
00:00:00.0082669

00:00:00.0159289
00:00:00.0067002

Я вот только понять не могу почему при первом просчете в обоих случаях время выходит больше чем при последующих.
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
17.08.2016, 22:00
Цитата Сообщение от КВА696 Посмотреть сообщение
Я вот только понять не могу почему при первом просчете в обоих случаях время выходит больше чем при последующих.
Если код выполняется при запуске приложения, то вероятно приложение еще не полностью загрузилось и ресурсы расходуются на что-то другое(джит-компиляция и прочая лабуда). А вообще, сказать об этом точно - вряд ли возможно.
Цитата Сообщение от КВА696 Посмотреть сообщение
Если интересно
Интересно было бы увидеть результаты теста в условиях, приближенных к реальным. Дает ли такой подход приемлемую производительность?
0
burning1ife
 Аватар для kenny69
1466 / 1287 / 294
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
19.08.2016, 01:12
Есть вот такое решение:
http://www.codeproject.com/Art... -in-Csharp
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.08.2016, 01:12
Помогаю со студенческими работами здесь

Замена текста по закладке
текст добавляю document.Bookmarks.Range.Text = text; как потом его заменить, если еще раз вызвать этот код -текст добавится но и...

Замена текста в строке
Не могу понять как реализовать Replace не подойдет Допустим, у меня есть строка &quot;This was realistic filling&quot; Как заменить...

Замена текста в TextBox
У меня есть текст TextBox и кнопка, в TextBox нужно вставить вот такой текст: &lt;Текст&gt;Текст2 &lt;Текст&gt;Текст2 &lt;Текст&gt;Текст2 ...

Замена текста в файле
Всем привет! На этот раз вопрос касающейся Работы с Файлами! Вот задание! 2. Создать программу для поиска указанного текста в файлах,...

Замена текста в файле
Помогите пожалуйста. Есть файл &quot;mytext.txt&quot; с таким содержанием: &lt;div class=&quot;one&quot;&gt;текст&lt;/div&gt; &lt;div...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru