1
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
Приветствуем вас,Гость, на форуме IFUD.WS. Обязательно рекомендуется к прочтению правила форума http://ifud.ws/threads/obnovleno-pravila-foruma.7759

C# Замена разделителя в базе C#

Тема в разделе "Исходные коды", создана пользователем Fox.cfg, 12 авг 2016.

  1. TopicStarter Overlay
    Fox.cfg

    Fox.cfg

    Регистрация:
    4 авг 2016
    Сообщения:
    4
    Симпатии:
    10
    Представим, что у нас есть склеенная база, где есть два разделителя: это : и ;

    Новички придумывают медленные функции типо "перебирайте весь массив и в каждом элементе делайте замену"
    Есть вариант куда проще - в одну строку.

    Представим, у нас есть string tempBase, содержащая строки из файла, полученные таким образом:

    Тогда заменить разделитель с ; на : можно таким образом:

    Или упрощенно:

    Если же у вас массив (string[] BaseArray), то можно сделать так:

    Чтобы превратить строку обратно в массив, воспользуйтесь функцией Split

     
    • Like Like x 1
    Метки:
  2. d1dy0u

    d1dy0u

    Регистрация:
    26 июл 2016
    Сообщения:
    66
    Симпатии:
    51
    Указывайте пожалуйста источник, откуда копипастили, некрасиво же

    Во-вторых, смею внести свою скромную ремарку - задумывались ли вы когда-либо (я понимаю что статья копипаст, что бы набрать классы посты, но давайте представим) ,как именно работает внутри String.Replace приведенный вами? Он точно также перебирает строку посимвольно, точно так же даелает malloc/free на каждый символ, поэтому посмею предложить метод, который на 300-500% быстрее чем вышеприведенный String.Replace

    Код:
    StringBuilder replacer = new StringBuilder(baseString.Length, baseString.Length * 2);
    baseString = replacer.Replace("oldChar","newChar").ToString();
    
    Дело в том, что StringBuilder позволяет выделить память сразу же, а так же указать ее максимальный размер, и замена происходит без бесполезных вызовов __malloc / __calloc

    Дабы не быть голословным - набросал небольшой бенчмарк
    Код:
    using System;
    using System.Diagnostics;
    using System.Text;
    
    public class Test
    {
        public static void Main()
        {
            Stopwatch stopWatch = new Stopwatch();
            var benchmarkTest = "test@test.ru:test1";
            var resultString = "";
           
            //forming fake base
            for(var i=0;i<10000;i++){
                resultString+=(new Random().Next().ToString()) + benchmarkTest;
                //randomizing for avoiding op-cache and IL-cache
            }
           
            stopWatch.Start();
           
              StringBuilder replacer = new StringBuilder(resultString.Length, resultString.Length * 2);
              //second parameter is buffer estimate - to optimize memory usage
             
             
              //uncomment first string and comment second, to see String.Replace performance
             
              //resultString = resultString.Replace(":",";");
             replacer.Replace(":",";");
             
           
           
            stopWatch.Stop();
           
            TimeSpan ts = stopWatch.Elapsed;
            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds);
            Console.WriteLine("RunTime " + elapsedTime);
           
        }
    }
    
    Который на 10 000 строк, у меня показывает следующие значения :

    String.Replace - 5ms
    StringBuilder.Replace - 1ms

    Посмотреть тест можно на ideone - Please login or register to view links
     
    • Like Like x 2
  3. 0x0

    0x0

    Регистрация:
    2 сен 2016
    Сообщения:
    2
    Симпатии:
    0
    Саму то строку в StirngBuilder Вы не добавили, результатом будет пустая строка. Во втором примере то же самое, инитится SB определенной capacity, с пустым value. Вы всё правильно написали, но для наглядности всё же стоит добавить
    Код:
    replacer.Append(baseString)
     

Поделиться этой страницей

Загрузка...