Си диез / Говнокод #24483 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 gogishvilli001, (Updated )

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

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

        use System.Text.StringBuilder, Luke.

        ну или 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 е ссылка на пустую строку в дебрях 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"
                        Ответить
                          • вполне вероятно что implementation defined. Ты не подумай грешным делом что там = перегрузили: просто "foo" + "bar" javac склеил

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

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

                                да, я когда-то работал в конторе где надо было сдавать)
                                Ответить
                                • Ты там жавой занимался или прыщеговно дрочил?
                                  Ответить
                        • лиретаролв конечно.

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

                              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 за нами чистит
                                  профит
                                  Ответить
                      • Пул для строк или строковых литералов? По идее "asd"+"qwe"=="asdqwe"
                        Ответить
    • ахахха

      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
          Ответить
          • Я не совсем это имел в виду. Символы не-аски и не кириллица, например.
            Ответить
              • Кириллица в utf-8 или в какой-нить еще кодировке. И тут ваш греп обсирается.
                Ответить
                • кирилитса все равно будет юзать восьмой бит байта: что в cp866 што в utf-8

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

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

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8