Конференция "Прочее" » Вот как надо на си шарп писать
 
  • palva © (16.04.08 10:31) [0]
    http://bash.org.ru/quote/396194
    Bool IsNumber (string str) {
    return (str.Replace ("0", "").Replace ("1", "").Replace ("2", "").Replace ("3", "").Replace ("4", "").Replace ("5", "").Replace ("6", "").Replace ("7", "").Replace ("8", "").Replace ("9", "").Length == 0);
    }

  • Ega23 © (16.04.08 10:35) [1]
    :)
  • БарЛог © (16.04.08 10:49) [2]
    Красиво
  • tesseract © (16.04.08 11:38) [3]
    А чего делает то ?
  • Ega23 © (16.04.08 11:47) [4]

    > А чего делает то ?


    А ты не понял? Типа, проверяет - число в строке, или нет  :)
  • tesseract © (16.04.08 11:51) [5]

    > Ega23 ©   (16.04.08 11:47) [4]


    Мдя... С++ -ую логику не отнимешь. На тебе 1с-вский , от франчей достался:


    Функция ПолучитьЗакупочнуюЦену(Товар,ДатаП= '01.01.1980') Экспорт

    Если ДатаП = '01.01.1980' Тогда
     ДатаП = ТекущаяДата();
    КонецЕсли;
               
    Цена  = СоздатьОбъект("Справочник.Цены");
    ТипЦены = СоздатьОбъект("Справочник.ТипыЦен");

    ТипЦены.НайтиПоНаименованию("Закупочные",0,1);

    Цена.ИспользоватьВладельца(Товар);
    Цена.ВыбратьЭлементы();

    ПОка Цена.ПолучитьЭлемент()=  1 Цикл
     
     Если Цена.ТипЦен = ТипЦены.ТекущийЭлемент() Тогда
      Возврат(Цена.Цена.Получить(ДатаП));
     КонецЕсли;
    КонецЦикла;
                 
    Возврат 0;

    КонецФункции    



    Такая функа на документ может раз 800 вызываться.
  • vuk © (16.04.08 11:57) [6]
    to tesseract ©   (16.04.08 11:51) [5]:
    >Мдя... С++ -ую логику не отнимешь.
    Так на Delphi под .net будет ровно точно так же. :)
    Так что C++ ни при чем.
  • TUser © (16.04.08 12:01) [7]
    Нормальный код. Я тоже иногда StringReplace в качестве параметра StringReplace'у  передаю.
  • Игорь Шевченко © (16.04.08 12:03) [8]
    тема отрицательных чисел не раскрыта
  • Virgo_Style © (16.04.08 12:04) [9]
    У этой функции большой потенциал. Навскидку вижу два способа еще большего запутывания, правда для C++, можно ли так в шарпе - не знаю.
  • vuk © (16.04.08 12:05) [10]
    to TUser ©   (16.04.08 12:01) [7]:
    >Нормальный код.
    Не, оно, конечно, работать будет. Просто есть же у класса int метод parse...
  • Evgeny V © (16.04.08 12:06) [11]
    На мой взгляд не красиво  - не очень читабельно.
    Тем более, что для целых чисел, укладывающихся в типы IntXX, вполне решается вызовом одной функции.
  • Styx_ (16.04.08 12:11) [12]

    > Не, оно, конечно, работать будет

    А пустая строка - это число или нет? :)
  • Dennis I. Komarov © (16.04.08 12:15) [13]
    > [12] Styx_   (16.04.08 12:11)

    Смотря в какой системе :)
  • vuk © (16.04.08 12:18) [14]
    to Styx_   (16.04.08 12:11) [12]:
    >А пустая строка - это число или нет? :)
    А, ну да, прощелкал этот момент. :)))
  • XentaAbsenta (16.04.08 12:23) [15]
    public string Replace(
    string oldValue,
    string newValue
    )

    Создаёт новый экземпляр строки, выделяя память. При этом старый экземляр достаётся GC, и когда он его освободит - известно только Богу и разрабочику GC.
    Если человек, которому я поручу что-то написать напишет ВОТ ТАКОЕ - оторву яйца.
  • БарЛог © (16.04.08 12:29) [16]
    XentaAbsenta   (16.04.08 12:23) [15]

    А если это будет женщина? ;)
  • XentaAbsenta (16.04.08 12:32) [17]
    public static bool IsNumber (in string InpStr)
    {
    if (InpStr == null)
    return false;
    int i;
    return Int32.TryParse(InpStr, i);
    }
  • b z (16.04.08 12:46) [18]

    > XentaAbsenta   (16.04.08 12:32) [17]

    Этот код тоже не очень, да и не правильный. :)
  • Styx_ (16.04.08 12:47) [19]
    Ну вообще это не эквивалентно первому. Потому как
    38 попугаев


    для одной - число, а для другой - нет.
  • XentaAbsenta (16.04.08 12:51) [20]
    b z   (16.04.08 12:46) [18]
    Этот код вообще не надо писать, т.е. вообще, я привёл его лишь как пример.
  • ferr (16.04.08 12:54) [21]
    нормальный функциональный подход =)
  • brother (16.04.08 12:55) [22]
    Интересно, а почему про системы исчисления не говорят?
    например:
    141 = 8D = 10001101 = 215
    8D это что? как можно сие расценить?) смайл?)))))))

    зы 8D - калькулятор жжеть)))
  • БарЛог © (16.04.08 13:02) [23]
    > Интересно, а почему про системы исчисления не говорят?
    Цифры системы задаются в Replace ("цифра", "").
  • brother (16.04.08 13:10) [24]

    > Цифры системы задаются в Replace ("цифра", "").

    вообще то я о том, как определить что например 8D это число, а не набор символов)
  • БарЛог © (16.04.08 13:19) [25]
    > вообще то я о том, как определить что например 8D это число, а не набор символов)
    $ вначале или h вконце? :)
  • Mystic © (16.04.08 13:39) [26]
    Один человек пошутил, а другие серьезно обсуждают. Аналогично можно написать сортировку путем перебора всех перестановок и последующей проверки на то, приводит ли эта перестановка к отсортированному массиву. И т. д.
  • XentaAbsenta (16.04.08 13:48) [27]
    Mystic ©   (16.04.08 13:39) [26]

    Я реально видел такой код в проекте. И такое действительно пишется к твоему сведенью, эта шутка не зря появилась.

    2.5 года назад народ в краснодаре приторговывал процессорным временем для формирования отчёта для одной очень непопулярной организации. Как ты думаешь, как так получилось?
  • han_malign © (16.04.08 13:54) [28]
    10:00:11:
    var
     Text,Buffer: string;
     BufSize: Integer;
     ch: char;
    begin
     Text:=LowerCase(IntToHex(AIntValue,1));
     BufSize:=(Length(Text) div 2) + (Length(Text) mod 2);
     HexToBin(PAnsiChar(Text),PAnsiChar(Buffer),BufSize);
     ch:=Buffer[Length(Buffer)-1];
     result:=(ch='1');
    end;
     10:00:49: чет не правильно делаю надо 2 бит у Int проверить
  • XentaAbsenta (16.04.08 14:02) [29]
    han_malign ©   (16.04.08 13:54) [28]
    что это?
  • iZEN (16.04.08 21:42) [30]

    > TUser ©   (16.04.08 12:01) [7]
    >
    > Нормальный код. Я тоже иногда StringReplace в качестве параметра
    > StringReplace'у  передаю.


    Это? Нормальный? Код?

    На длинной строке этот код всю память сожрёт, так как строки с C# немутабельны (как и в Java). То есть при каждой замене цифры на пустую "строку" ("") будет создаваться новая строка, которая короче предыдущей на один символ. И так будет делаться каждый раз при каждой замене.
  • antonn © (16.04.08 21:50) [31]

    > tesseract ©   (16.04.08 11:51) [5]
    >
    >
    > > Ega23 ©   (16.04.08 11:47) [4]
    >
    >
    > Мдя... С++ -ую логику не отнимешь. На тебе 1с-вский , от
    > франчей достался:

    три раза просмотрел, плакать хочется :(
    не от функции, от синтаксиса :((
  • XentaAbsenta © (16.04.08 23:37) [32]
    antonn ©   (16.04.08 21:50) [31]
    Clarion тебе в задний проход и электричку навстречу. И если тебе дадут пописать после этого хотябы на 1С будешь самым счастливым человеком на свете.
  • Семеныч (17.04.08 00:19) [33]
    Код в сабже или шутка, или написан пионером. Протому что нормальному программеру такое убожество даже спьяну не приснится.
  • Германн © (17.04.08 00:33) [34]

    > Протому что нормальному программеру

    Критерии нормальности программера в студию!
    :)
  • Семеныч (17.04.08 00:40) [35]
    > Германн ©   (17.04.08 00:33) [34]

    > Критерии нормальности программера в студию!

    Нет проблем. Нормальный программер - это такой программер, который критерии нормальности программера знает и сам.
  • Германн © (17.04.08 01:32) [36]

    > Семеныч   (17.04.08 00:40) [35]
    >
    > > Германн ©   (17.04.08 00:33) [34]
    >
    > > Критерии нормальности программера в студию!
    >
    > Нет проблем. Нормальный программер - это такой программер,
    >  который критерии нормальности программера знает и сам.
    >

    Даже в пьяном угаре?
    Тогда такие есть только в Красной Книге. Если есть?

    P.S. Тут ещё одно. Программер пишет, а юзер пользует!
    Критерии нормальности юзера, тоже в студию.
  • Пробегал2... (17.04.08 02:07) [37]
    tesseract ©   (16.04.08 11:38) [3]
    А чего делает то ?


    Ну ты даешь, код красивейший ;)
  • kaif © (17.04.08 02:54) [38]
    Красивейший только для программиста, живущего в абстрактном пространстве сишника. Любой программист, задумывающийся о реализации подобных алгоритмов, сообразит, например, что последовательная замена цифр на пустой символ требует каждый раз при замене создания нового буфера и перезаписи туда всей строки. Таким образом проверка на "цифровость" строки в 10 символов потребует создания как минимум 10 новых буферов на ходу, то есть 10 новых запросов по аллокированию памяти.
    Вместо этого, ИМХО, нормальный программист, близкий так сказать "к железу" (скажем, дельфист) предпочтет заменить символы цифр на символ пробела (пусть даже он бы воспользовался подобной идеей, находя ее "красивой"), а затем применение однократной функции типа Trim(). Тогда все можно будет реализовать в одном буфере и не аллокировать 10 раз новую память.
    В данном же случае не просто многократно аллокируется память, но и создается столько объектов типа string, сколько символов было в исходной строке. Со всеми накладными расходами и всеми вытекающими...
    Причем никакой оптимизатор-транслятор не сообразит, как это оптимизировать.
    Я лично не вижу никакой красоты в этом алгоритме, прошу меня извинить.
    И, наконец, существуют критерии оптимальности алгоритмов.
    Для того чтобы принять решение IsDigit для строки в 20 символов нужно принять не более 20 решений типа да/нет. Если алгоритм производит больше 20 решений, то он неоптимален. А данный алгоритм производит больше решений. И это легко показать.
    Допустим у нас трока выглядит так:

    s = "123^4567";

    Нормальный алгоритм, например, цикл for, проверяющий один символ за другим, сделает 4 проверки на "диджитность" и покинет цикл на четвертом шаге, разумно полагая, что '^' - не цифра и дальше проверять уже нечего.

    А восхваляемый за "красоту" алгоритм сабжа будет продолжать заменять все цифры, включая 4,5,6,7 и даже пытаться выискать и заменить во всех позициях (просканировав их все всякий раз и приняв в конечном итоге по 8 решений 10 раз) несуществующие здесь 8 и 9 на пустой символ, что есть дурость чистой воды. Данный алгоритм при длине строки в 100 символов примет как минимум 1000 решений по замене/незамене символов на "пустой", даже если там вообще не было цифр, а это был голимый текст, начинающийся с буквы, для которого достаточно было убедиться в том, что первый символ - буква и уже делать Exit.
  • Пробегал2... (17.04.08 04:46) [39]
    kaif ©   (17.04.08 2:54) [38]
    сообразит, например, что последовательная замена цифр на пустой символ требует каждый раз при замене создания нового буфера и перезаписи туда всей строки. Таким образом проверка на "цифровость" строки в 10 символов потребует создания как минимум 10 новых буферов на ходу, то есть 10 новых запросов по аллокированию памяти


    нда... господа, качайте ЧЮ, больше сказать просто НЕ-ЧЕ-ГО ;))

    kaif ©   (17.04.08 2:54) [38]
    Вместо этого, ИМХО, нормальный программист, близкий так сказать "к железу" (скажем, дельфист) предпочтет заменить символы цифр на символ пробела


    нормальный программист как минимум просто пробежится по символам такой строки на проверку. А не 10 раз пробежится (при замене всех цифр)

    kaif ©   (17.04.08 2:54) [38]
    И, наконец, существуют критерии оптимальности алгоритмов


    да что же такое.. Кайф, хватит загоняться, это же явно шутка, индусский код, чего тут обсуждать...
  • TUser © (17.04.08 08:03) [40]
    > kaif ©   (17.04.08 02:54) [38]

    Все верно. Но. Задачи бывают разные. Программы бывают разные. Кусочки у этих программ бывают разные. Бывает, что где-то важна скорость, использование памяти или что-то еще. Тогда мы напишем оптимально. Мы, ежели надо, ассемблер выучим. А бывает, что важнее другое - например, скорость написания кода или его читабельность. Бывает, что соображения типа "оптимальность алгоритма" идут лесом.

    Сабж приведен без контекста, в котором он использован. А без контекста понять, нормально это или нет, - нельзя. Я бы сам скорее написал что-нибудь вроде for '0'..'9' do MyStr := StringReplace (), а не сабж, но буфер дополнительный у меня тоже бы аллокировался.

    Что касается подобных проблем, то существуют языки, где такие дела вообще никак нельзя контролировать - от жавыскрипта до питона со всеми остановками. У этих языков есть своя ниша, где они востребованы.
  • TUser © (17.04.08 08:03) [41]
    > kaif ©   (17.04.08 02:54) [38]

    Все верно. Но. Задачи бывают разные. Программы бывают разные. Кусочки у этих программ бывают разные. Бывает, что где-то важна скорость, использование памяти или что-то еще. Тогда мы напишем оптимально. Мы, ежели надо, ассемблер выучим. А бывает, что важнее другое - например, скорость написания кода или его читабельность. Бывает, что соображения типа "оптимальность алгоритма" идут лесом.

    Сабж приведен без контекста, в котором он использован. А без контекста понять, нормально это или нет, - нельзя. Я бы сам скорее написал что-нибудь вроде for '0'..'9' do MyStr := StringReplace (), а не сабж, но буфер дополнительный у меня тоже бы аллокировался.

    Что касается подобных проблем, то существуют языки, где такие дела вообще никак нельзя контролировать - от жавыскрипта до питона со всеми остановками. У этих языков есть своя ниша, где они востребованы.
  • ferr (17.04.08 10:55) [42]
    дет сад..
    > [38] kaif ©   (17.04.08 02:54)
    никогда не смотрите на функциональные языки, обычно там всё так неоптимально.. так неоптимально..

    а если уж по сабжу то для меня вариант один, примерно так : return new Regex(@"^\d+$").IsMatch(s);
  • Дмитрий С (17.04.08 16:53) [43]

    > а если уж по сабжу то для меня вариант один, примерно так
    > : return new Regex(@"^\d+$").IsMatch(s);

    А так по идее быстрее будет =)
    return ! (new Regex(@"[^\d]").IsMatch(s));
  • TUser © (17.04.08 17:30) [44]
    Только не доказвайте, что это - понятнее.
  • Polevi (17.04.08 17:55) [45]
    это смотря кто смотрит
  • Mystic © (17.04.08 21:03) [46]

    > Вместо этого, ИМХО, нормальный программист, близкий так
    > сказать "к железу" (скажем, дельфист) предпочтет заменить
    > символы цифр на символ пробела (пусть даже он бы воспользовался
    > подобной идеей, находя ее "красивой"), а затем применение
    > однократной функции типа Trim(). Тогда все можно будет реализовать
    > в одном буфере и не аллокировать 10 раз новую память.


    Ничего не даст. В C# строки константные (для обеспечения потокобезопасности), так что если ты меняешь один символ в строке на другой, то все равно будет выделена новая память.

    Кстати, метод int.parse не эквивалентен данному. Ибо в строке может быть штрихкод из 20 символов, что не поместится в int. Regex тоже не оптимальный вариант, потому что каждый раз будет выполняться построение конечного автомата для разбора регулярного выражения.
  • palva © (17.04.08 21:11) [47]

    > Ничего не даст.

    Ну да, не даст. Для замысловатых модификаций строк есть специальный тип StringBuilder.
    Но в данной задаче модификаций, естественно, не требуется.
  • DiamondShark © (17.04.08 21:18) [48]

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

    это если писать return new Regex(@"^\d+$").IsMatch(s);

    А если объект создать один раз, да ещё с опцией компиляции, то нормально.
  • Поп Гапон (17.04.08 23:31) [49]

    > tesseract ©   (16.04.08 11:51) [5]
    >
    >
    > > Ega23 ©   (16.04.08 11:47) [4]
    >
    >
    > Мдя... С++ -ую логику не отнимешь. На тебе 1с-вский , от
    > франчей достался:


    Ммм... во франчи что ли пойти. Им на 8.* больше чем делфистам и сишникам раза в два в Киеве платят.
  • Поп Гапон (17.04.08 23:35) [50]
    База была на Access где было 60 полей в строке Fax1,Fax2...Fax60 ну и подобные маразмы


    function TTemplateHelper.CreateOtherContacts(ADOQuery: TADOQuery): WideString;
    const
     cFaxName = 'Fax';

     cPhoneContactString =
     '<ParaStyle:Txt\_tel><CharStyle:Txt\_ram>$#$Type$#$ ............................................................................<Cha rStyle:><ParaStyle:Txt\_tel><CharStyle:Tel\_ram> $#$Value$#$<CharStyle:>'+ #13 + #10;
     cPhoneWithCodeContactString =
     '<ParaStyle:Txt\_tel><CharStyle:Txt\_ram>$#$Type$#$ ....................................................................<CharStyle:> <ParaStyle:Txt\_tel><CharStyle:Tel\_ram> $#$Value$#$<CharStyle:>'+ #13 + #10;

     cMobileContactString =
     '<ParaStyle:Txt\_tel><CharStyle:Txt\_ram>$#$Type$#$ ........................................................<CharStyle:><ParaStyle:T xt\_tel><CharStyle:Tel\_ram> $#$Value$#$<CharStyle:>'+ #13 + #10;

     cICQContactString = '<ParaStyle:Txt\_tel><CharStyle:Txt\_ram>$#$Type$#$ ............................................................................<Cha rStyle:><ParaStyle:Txt\_tel><CharStyle:Tel\_ram> $#$Value$#$<CharStyle:>'+ #13 + #10;

     cFaxContactString =
     '<ParaStyle:Txt\_tel><CharStyle:Txt\_ram>$#$Type$#$ ..................................................................<CharStyle:><P araStyle:Txt\_tel><CharStyle:Tel\_ram> $#$Value$#$<CharStyle:>'+ #13 + #10;
     cFaxWithCodeContactString =
     '<ParaStyle:Txt\_tel><CharStyle:Txt\_ram>$#$Type$#$ ..........................................................<CharStyle:><ParaStyle :Txt\_tel><CharStyle:Tel\_ram> $#$Value$#$<CharStyle:>'+ #13 + #10;
    var
     FaxCount: integer;
     Fax1, Fax2: WideString;
     lResStr: WideString;
     lPhoneCode: WideString;
     lCode, lNumber: WideString;
    begin

     Result := '';
     //
     FaxCount := 0;
     while True do
       begin
         Fax1 := GetItemForReplace(ADOQuery, cFaxName + IntToStr(FaxCount + 1));
         Fax2 := GetItemForReplace(ADOQuery, cFaxName + IntToStr(FaxCount + 2));
         //увеличиваем
         inc(FaxCount, 2);

         //проверяем значения и распихиваем по шаблону
         if Trim(Fax1) = '' then Break;

         //получаем телефонный код города
         lPhoneCode := GetPhoneCode;

         //парсим на код и телефон
         ParsePhoneNumber(Fax2, lCode, lNumber);
         if lCode <> '' then
           begin
             lPhoneCode := lCode;
             Fax2 := lNumber;
           end;

         //по умолчанию
         lResStr := cPhoneContactString;
         //иначе производим проверки
         if CheckForICQ(Fax1) then
           begin
             Fax2 := ICQSpaced(Fax2);
             lResStr := cICQContactString;
           end;
         if CheckForMobile(Fax1) then
           begin
             Fax1 := 'Моб_льний';
             lResStr := cMobileContactString;
           end;
         //телефон с учетом кода города
         if CheckForPhone(Fax1) then
           begin
             if (lPhoneCode <> '') then
               lResStr := cPhoneWithCodeContactString
             else
               lResStr := cPhoneContactString;
           end;
         //Факс с учетом кода города
         if CheckForFax(Fax1) then
           begin
             Fax1 := 'Тел. /факс';
             if (lPhoneCode <> '') then
               lResStr := cFaxWithCodeContactString
             else
               lResStr := cFaxContactString;
           end;

         //если не ICQ то добавляем код города
         if (lPhoneCode <> '') and (not CheckForICQ(Fax1)) then
           Fax2 := lPhoneCode + ' ' + PhoneSpaced(Fax2);
         //иначе просто форматируем телефон
         if (lPhoneCode = '') and (not CheckForICQ(Fax1)) then
           Fax2 := PhoneSpaced(Fax2);

         //подставляем
         lResStr := Tnt_WideStringReplace(lResStr, '$#$Type$#$',Fax1, [rfReplaceAll, rfIgnoreCase]);
         lResStr := Tnt_WideStringReplace(lResStr, '$#$Value$#$',Fax2, [rfReplaceAll, rfIgnoreCase]);
         Result := Result + lResStr;
       end;
    end;

 
Конференция "Прочее" » Вот как надо на си шарп писать
Есть новые Нет новых   [134434   +30][b:0.001][p:0.005]