Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как правильней работать со строками?

8.9K
24 октября 2006 года
Kulti
77 / / 29.07.2006
Вот значит делаю 5-точечную мутацию. Хромосома храницца в строке. Может кто подскажет, как это записать нормальным языком, а то мне этот код не особо нравицца:
Код:
private String Mutation(String s)
        {
            int pos = 0;
            for (int n = 0; n < 5; n++)
            {
                pos = r.Next() % 31;
                if (s.Substring(pos, 1) == "0")
                    s = s.Remove(pos, 1).Insert(pos, "1");
                else
                    s = s.Remove(pos, 1).Insert(pos, "0");
            }
            return s;
        }
242
24 октября 2006 года
Оlga
2.2K / / 04.02.2006
как минимум if можно упростить, вместо
 
Код:
if (s.Substring(pos, 1) == "0")

можно:
 
Код:
if(s[pos] == '0')
273
25 октября 2006 года
3A3-968M
1.2K / / 22.12.2005
Что за переменная "r"??? Ну да ладно, предлагаю вот так:
Код:
[SIZE=2][COLOR=#0000ff][FONT=Courier New]private [/FONT][/COLOR][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]String[/COLOR][/SIZE][SIZE=2] Mutation([/SIZE][SIZE=2][COLOR=#008080]String[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] s)[/FONT]
[FONT=Courier New]{[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] for[/COLOR][/SIZE][SIZE=2] ([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] n = 0; n < 5; n++)[/FONT]
[FONT=Courier New] {[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]   int[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] pos = r.Next() % 31;[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]   string[/COLOR][/SIZE][SIZE=2] temp = [/SIZE][SIZE=2][COLOR=#800000]"0"[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New];[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]   if[/COLOR][/SIZE][SIZE=2] (s[pos] == [/SIZE][SIZE=2][COLOR=#800000]'0'[/COLOR][/SIZE][SIZE=2]) temp = [/SIZE][SIZE=2][COLOR=#800000]"1"[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New];[/FONT]
[FONT=Courier New]   s = s.Remove(pos, 1).Insert(pos, temp);[/FONT]
[FONT=Courier New] }[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] return[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] s;[/FONT]
[FONT=Courier New]}[/FONT]
[/SIZE]
8.9K
25 октября 2006 года
Kulti
77 / / 29.07.2006
Ясненько...
Насчет r: это поле типа [color="#008080"]Random[/color]
Еще вопросик: Что лучше в плане оптимальности [color="#008080"]String[/color] или [color="#008080"]Char[/color][]?
303
26 октября 2006 года
makbeth
1.0K / / 25.11.2004
В плане производительности лучше StringBuilder (по сути обертка char[]):
 
Код:
private string Mutation(string s)
{
    StringBuilder str = new StringBuilder(s);
    for (int n = 0; n < 5; n++)  
    {
        int pos = r.Next() % 31;  
        str[pos] = str[pos] == '0' ? '1' : '0';
    }  
    return str.ToString();
}
273
26 октября 2006 года
3A3-968M
1.2K / / 22.12.2005
Как бы то ни было странным, работа с массивом напрямую быстрее всего. Поэтому классические циклы for быстрее чем удобные foreach. Поэтому что String, что StringBuilder для индексации применяют доступ к массиву символов типа Char[], что уже быстрее чем сам Char[] быть не может. Замерить производительность можно различными Perfomance Counter'ами.
303
26 октября 2006 года
makbeth
1.0K / / 25.11.2004
А я и не спорю. Но зачем изобретать велосипед (по сути перегоняя строку в char[], а потом наоборот), когда есть уже готовое и очень удобное решение? Ну если только предложить автору топика переделать программу с о string на Char[]? ;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог