1. C# / Говнокод #24483

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    private void OutputLabels(DataTable dt)
    {
       string label; 
    
       // Iterate rows of table
       foreach (DataRow row in dt.Rows)
       {
          int labelLen;
          label = String.Empty;
          label += AddFieldValue(label, row, "Title");
          label += AddFieldValue(label, row, "FirstName");
          label += AddFieldValue(label, row, "MiddleInitial");
          label += AddFieldValue(label, row, "LastName");
          label += AddFieldValue(label, row, "Suffix");
          label += "\n";
          label += AddFieldValue(label, row, "Address1");
          label += AddFieldValue(label, row, "AptNo");
          label += "\n";
          labelLen = label.Length;
          label += AddFieldValue(label, row, "Address2");
          if (label.Length != labelLen)
             label += "\n";
          label += AddFieldValue(label, row, "City");
          label += AddFieldValue(label, row, "State");
          label += AddFieldValue(label, row, "Zip");
          Console.WriteLine(label);
          Console.WriteLine();
       }
    }
    
    private string AddFieldValue(string label, DataRow row, 
                                 string fieldName) 
    {                                
       if (! DBNull.Value.Equals(row[fieldName])) 
          return (string) row[fieldName] + " ";
       else
          return String.Empty;
    }

    label не используется в AddFieldValue. Официальный пример MS - https://docs.microsoft.com/en-us/dotnet/api/system.dbnull.value?view=netframework-4.7.2

    Запостил: gogishvilli001, 12 Июля 2018

    Комментарии (90) RSS

    • говно еще и в том что собирать строку через += это треш
      Ответить
      • А как нужно? Прокидывать внутрь по ссылке?
        Ответить
        • Строки не мутабельны в CLR.

          use System.Text.StringBuilder, Luke.

          ну или List<string> и потом Join какой-гнить
          Ответить
          • > ну или List<string> и потом Join какой-гнить
            Чую питониздо
            Ответить
            • что я не так скойзал?
              public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, 
              	IEnumerable, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>
              
              String.Join Method (String, IEnumerable<String>)


              но лучгше StringBuilder конечно
              Ответить
              • Просто это путхон вау.

                ЗЫ. Еси есь сринг буйлдыр, то конешно лутше иго юзать.
                Ответить
                • так и луавей тоже: там же в pil пример почому надо не ".." в цыкле а всё в таблку сначала.

                  но в жабе и CLR у нас StringBuilder, за свою пткобезопастность в жабе прозванный буфером
                  Ответить
    • А в чёймь задница между "" и String.Empty?
      Ответить
      • чтобы ни пихать в пул строк еще и ""
        экономят нескока байт
        Ответить
        • > чтобы ни пихать в пул строк, еще и "" экономят нескока байт

          или

          > чтобы ни пихать в пул строк еще и "", экономят нескока байт

          ???
          Ответить
          • String.Empty е ссылка на пустую строку в дебрях CLR
            А "" попадет в стат. секцию файла, пул строк.

            Разумеется, везде где ты укажешь "" ты получишь ссылку на одну и ту же строку, но в случае String.Empty ты не будешь засирать свой стрингпул лишней строкой.

            Кроме того String.isNullOrEmpty наверняка начинается с проверки указателя на равенство с String.Empty, а в случае "" тебе придеца сравнивать строку.

            Так что использувая String.Empty ты экономишь несколько тактов CPU и 2 байта (0x00 0x00) в строковом пуле.

            так вижу
            Ответить
            • В сисярпе вроде как интернализация строк.
              Ответить
              • >В сисярпе вроде как интернализация строк.
                >>Разумеется, везде где ты укажешь "" ты получишь ссылку на одну и ту же строку
                Ответить
                • Просмотрел по диагонали посты, вчитываться было влом. Если аж 2 байта не на строку а в сумме то херня.
                  Ответить
                  • да, всего 2 байта)) конечно херня

                    Стринг пулы есть во всех ЯПах где немутабельные строки: строковые литералы всегда кладутся в волшебное место и все 100500 их упоминаний превращаются в ссылку на них. И в .NET и в сишечке или JVM
                    Ответить
                    • В жаве нету.
                      Ответить
                      • есть, если ты не явно new String() конечно

                        правда я х3 если это JVM spec или импл. детали OracleJVM/OpenJDK

                        String foo = "abc";
                        String bar = "abc";
                        assert foo == bar;
                        Ответить
                        • Пул для строк или строковых литералов? По идее "asd"+"qwe"=="asdqwe"
                          Ответить
                        • Пул для строк или строковых литералов? По идее "asd"+"qwe"=="asdqwe"
                          Ответить
                          • Ух нихуя себе. Я что-то пропустил, или это implementation defined? https://ideone.com/OrHDmb
                            Ответить
                            • вполне вероятно что implementation defined. Ты не подумай грешным делом что там = перегрузили: просто "foo" + "bar" javac склеил

                              а так про это на экзамене по SCJP еще спрашивали в хуйзнает когда году)
                              Ответить
                              • Да, точно. Явно склеил.
                                Ответить
                              • Я знал что в жавке интернализации нет, но ты меня вверг в сомнение.

                                Ты жаваэкзамены сдавал?
                                Ответить
                                • может, раньше и не было. Но в шестерке уже была. Можно явно интернуть строку даже если ты ее собрал из мссива чаров, па сути сделать запись в пуле

                                  да, я когда-то работал в конторе где надо было сдавать)
                                  Ответить
                              • Да, точно. Явно склеил.
                                Ответить
                              • syoma?
                                Ответить
                          • лиретаролв конечно.

                            Если ты билдером соберешь строку "макака" от она не будет равна литералу "макака"
                            Ответить
                            • Кому нахуй нужны литералы? От него будет прок, скажем, в декодированном жсоне.
                              Ответить
                              • ну типа в коде обычно используют литералы.

                                System.out.print("пшел в дупу");

                                Жысон наврядли кто-то интернит, но можно, если ты его 10050 раз грузишь

                                Тащимт главный смысл пула в том чтобы код

                                for(int i = 0; i < 100500;i++) {
                                foo.setBar("pitux");
                                }

                                не создал тебе 100500 питухов
                                Ответить
                                • Да причем тут нахуй 100500 раз. Типичный большой жсон - это список из словарей с одинаковыми ключами. Интернализация тут должна сильно помочь.
                                  Ответить
                                  • да, ты прав.

                                    1) грузим в память сорок две строки "key"
                                    2) получаем те-ле-фун-ке 42 объекта
                                    3) интернируем
                                    4) получаем 1 объект
                                    5) GC за нами чистит
                                    профит
                                    Ответить
                                    • Почему сразу их при создании не интернализировать?
                                      Ответить
      • ахахха

        string.Empty wins in a really corner case, which can lead to some magical bug and really hard to debug:

        If there is a zero width space in "".
        Ответить
        • На самом деле лечится поиском не-ascii символов в сырцах. Грепом это реально? И реально ли сделать поиск символов, не входящих в определенные диапазоны?

          Кто-то кроме меня наступал на грабли с русской с вместо латинской?
          Ответить
          • > Грепом это реально? И реально ли сделать поиск символов, не входящих в определенные диапазоны?
            $ grep -P -n "[^\x00-\x7F]" file
            Ответить
            • Я не совсем это имел в виду. Символы не-аски и не кириллица, например.
              Ответить
              • Ну тогда отрежь первые 32 символа еще
                [^\x20-\x7F]
                Ответить
                • Кириллица в utf-8 или в какой-нить еще кодировке. И тут ваш греп обсирается.
                  Ответить
                  • кирилитса все равно будет юзать восьмой бит байта: что в cp866 што в utf-8

                    ну если конечно система аскисовместима, если это не советский комп который вообще не умеет англ буквы
                    Ответить
                  • С какого хуя он обсирается, если в регулярке можно написать тем же utf-8 /А-ЯЁа-яё/?
                    Ответить
                    • И как будет работать диапазон, ты подумал?
                      Ответить
                      • Подумал и проверил, а что, что-то не так?
                        Ответить
                        • а-я не будет работать как (последний байт a)-(первый байт я)?
                          Ответить
                  • Вот тебе в явном виде utf-8 кириллица, фома неверующий
                    $ grep -P -n "[^\x20-\x7F\x{0400}-\x{04FF}]" file
                    Ответить
                    • Греп осилил utf-8? Хуясе.
                      Ответить
                      • На самом деле -P — не позиксовая фича, типа перловые регекспы. Но ГНУтый умеет. А как это сделать без -P я не ебу, потому что я самый зелёный нуб на этом сайте. Спроси у Стертора.
                        Ответить
                        • Вот тебе те же перлоебские регекспы

                          In [5]: re.findall(u'[а-я]', u'хуй')
                          Out[5]: [u'\u0445', u'\u0443', u'\u0439']
                          
                          In [6]: re.findall('[а-я]', 'хуй')
                          Out[6]: ['\xd1', '\xd1', '\xd0', '\xb9']
                          
                          In [7]: 'хуй'.encode('hex')
                          Out[7]: 'd185d183d0b9'
                          Ответить
                          • Не уловил, к чему ты клонишь.

                            З.Ы. кстати, почитал, для -P grep использует установленный в систему PCRE, так что можно было вообще писать
                            $ grep -P "[\p{Cyrillic}]" file
                            Ответить
                            • Ух какие прыщи умные стали. Это часть pcre? В питоне тоже так можно?
                              Ответить
                        • In [13]: repr(u'[а-я]')
                          Out[13]: "u'[\\u0430-\\u044f]'"
                          
                          In [14]: repr('[а-я]')
                          Out[14]: "'[\\xd0\\xb0-\\xd1\\x8f]'"


                          Вот ты и получишь по идее \xb0-\xd1
                          Ответить
                          • Складно поёшь, но grep [а-я] из терминала ubuntu, тем не менее, работает как надо.
                            Ответить
                            • если у тебя стоит локаль правильная то всё работает и даже без прыщей и гну и без PCRE: с обычгными BREs/EREs
                              $ cat text.txt
                              pure English
                              смешанный language
                              чистый русский
                              
                              $ grep "[а-яА-Я]" text.txt
                              смешанный language
                              чистый русский
                              
                              $ locale
                              LANG=
                              LC_COLLATE="en_US.UTF-8"
                              LC_CTYPE="en_US.UTF-8"
                              LC_MONETARY="en_US.UTF-8"
                              LC_NUMERIC="en_US.UTF-8"
                              LC_TIME="en_US.UTF-8"
                              LC_MESSAGES="en_US.UTF-8"
                              LC_ALL=en_US.UTF-8


                              чтите прыщепозикс

                              LC_COLLATE
                              This variable determines the locale category for character collation. It determines collation information for regular expressions and sorting, including equivalence classes and multi-character collating elements, in various utilities and the strcoll() and strxfrm() functions. Additional semantics of this variable, if any, are implementation-dependent.
                              Ответить
                              • Чтим.
                                Ответить
                              • Таки греп умеет в локали?
                                Ответить
                                • posix grep отсылает нас к Extended Regular Expressions.
                                  Extended Regular Expressions сообщает нам

                                  Regular expressions are a context-independent syntax that can represent a wide variety of character sets and character set orderings, where these character sets are interpreted according to the current locale. While many regular expressions can be interpreted differently depending on the current locale, many features, such as character class expressions, provide for contextual invariance across locales.

                                  Так что да, обязан уметь

                                  зы: разумеется, твой TTY должен уметь локаль тоже
                                  Ответить
                                  • >> твой TTY должен уметь локаль тоже
                                    переведи
                                    Ответить
                                    • на PHP?

                                      Твой терминал должен уметь отображать символы в указаенной в локале кодировке. Иначе grep погрепает, а не выходе покажет тебе мусор.
                                      Ответить
                                      • Какое это отношение к винде имеет?
                                        Ответить
                                        • Сема, где ты тут винду увидел?
                                          Ответить
                                          • Ну у меня винда, вот я и спрашиваю, какое отношение это ко мне имеет.
                                            Ответить
                                            • никакое. Про виндовую консоль и ее utf мы уже 100500 раз говорили. Как работает порт grep на винде с utf8 я не знаю, думаю что хуево работает.

                                              findstr, вероятно, работает хорошо.

                                              А лучше всего работает Select-String
                                              в помершале
                                              Ответить
                                              • Нахуй ей utf8 когда там изначально UTF16, только через спец апи?
                                                Ответить
                                              • Нахуй ей utf8 когда там изначально UTF16, только через спец апи?
                                                Ответить
                                              • Нахуй ей utf8 когда там изначально UTF16, только через спец апи?
                                                Ответить
                          • А давайте песать самомодифицирующиеся регулярные выражения [color=green]только в ascii кодах[/color]
                            Ответить
                            • А давайте песать кокой-нибудь байткод только в ascii-кодах?

                              Sun/Oracle JVM не подходит: там class-файл начинается с CA, FE, BA, BE (hex).

                              Вспоминаем, какие у нас ещё бывают байткоды.
                              Ответить
                              • Dalvik тоже не годится: там нулевой байт в заголовке.
                                Ответить
                              • там же чуть-ли не 1 байт на байткод и всего их 255 то

                                Кроме кафе бэбе есть еще MZ у PE и ELF у ELF и 55AA у всех BIOS ROMов от карточек всех двух видов до mbr
                                Ответить
              • Конечно, как сказал роскомговно, поставь любые нужные диапазоны, даже непрерывность необязательна. Это обычная регулярка.
                Ответить
          • греп умеет рагулярки и ключег "-v", а значит реально
            ~$ cat 1.txt
            hello
            питве
            ~$ grep -v "[a-zA-Z0-9_ ]" 1.txt
            питве
            Ответить
            • Ты всё перепутал.

              Строка считается сматченной, если в ней найдено хотя бы одно вхождение паттерна. Не обязательно вся строка матчится как паттерн. -v инвертирует вывод, то есть мы увидим только такие строки, которые ПОЛНОСТЬЮ состоят из символов, не входящих в [a-zA_Z0-9_ ]. Поэтому тебе и выдало питве. Если бы там была e латиницей, строка бы не вывелась.

              Задача же, насколько я понял, требует вывести наоборот, все такие строки, где есть хотя бы один non-ascii character, и, желательно, его подстветить.
              Ответить
              • sed s/[a-zA-Z0-9_]+//g

                В выхлопе останутся только символы, не входящие в диапазон.
                Ответить
                • И потом ищи свищи, где они в файле.

                  Приведенный мной греп их подсветит красным цветом и сообщит номер строки.
                  Ответить
                  • >>подсветит красным цветом
                    кста, это не позиксовая хрень емнип
                    но GNUный умеет
                    Ответить
                    • Кстати, как это проверить?

                      Убедиться, что вот на этой
                      http://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html
                      странице нет слова color достаточно?
                      Ответить
                      • да
                        и тут нет
                        https://man.openbsd.org/grep.1

                        а тут есть

                        https://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html#Environment-Variables
                        Ответить
                    • А гну это не позикс?
                      Ответить
                      • гну расширяет позикс
                        Ответить
                      • ГНУ имплементит позикс. Можно уметь больше позикса. Нельзя уметь меньше или иначе чем позикс.
                        Ответить
              • а, ну раз так тогда в символьную пихаем шапочку для отрицания и пишем коды символов от 1 до 127.

                ps: ой, ты так и сделал же
                Ответить

    Добавить комментарий