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

    +137

    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
    public static string AddControlDigits(string input)
    {
          if (String.IsNullOrEmpty(input))
              return "";
          try
          {
              XDocument doc = XDocument.Parse(input.JavaSubString(input.IndexOf("<contracts>"), input.IndexOf("</contracts>") + "</contracts>".Length));
              String s = new String(doc.ToString().ToCharArray());
                    
              XElement rootElement = doc.Root.Element("list_item");
    
              string basicNumber = rootElement.Element("basicNumber").Value;
              string endNumber = rootElement.Element("endNumber").Value;
              string loanCaseNumber = rootElement.Element("loanCaseNumber").Value;
              string loanCaseComplementNumber = rootElement.Element("loanCaseComplementNumber").Value;
              string bridgeLoanComplementNumber = rootElement.Element("bridgeLoanComplementNumber").Value;
    
              int checkNumber = CalcCheckDigitCU(basicNumber + endNumber);
              int loanCaseCheckNumber = calcCheckDigitUP(loanCaseNumber);
              int bridgeLoanCheckNumber = CalcCheckDigitCU(basicNumber + bridgeLoanComplementNumber);
    
              rootElement.Add(new XElement("checkNumber", checkNumber));
              rootElement.Add(new XElement("loanCaseCheckNumber", loanCaseCheckNumber));
              rootElement.Add(new XElement("bridgeLoanCheckNumber", bridgeLoanCheckNumber));
    
              input = input.Replace(s, doc.ToString());
    
              return "";
         }
         catch (Exception ex)
         {
             throw;
          }
     }

    жопа

    Запостил: taburetka, 10 Января 2014

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

    • String s = new String(doc.ToString().ToCharArray());

      Гениально
      Ответить
      • этим надо гордиться
        Ответить
      • > Гениально
        Дальше - еще гениальней. Замена ноды в XML через... String.replace. Автору надо идти работать практологом, бесценный опыт уже есть...
        Ответить
        • там такая фишка что на входе XML с несколькими root нодами, поэтому его не загонишь в XDocument. То есть это - строка которая похожа на XML, такой его внебрачный сын.
          Ответить
          • > XML с несколькими root нодами
            Ёбаный пиздец, простите, не удержался.

            Ну вот зачем, зачем люди нарушают стандарты... XML и так не сахар, так они еще проблем себе и другим добавляют... Вот неужели им было так сложно заключить эти несколько root нод в истинную root ноду, и юзать самый обычный парсер...?
            Ответить
            • я вообще никогда ни в одном языке не видел изящный способ работы с XML. Eсли видишь в коде срач, скорее всего речь идет о XML.
              Ответить
              • > изящный способ работы с XML
                У вас была проблема, и для ее решения вы выбрали XML. Теперь у вас две проблемы.

                Ну по крайней мере, если юзаются стандартные генераторы и парсеры, то хотя бы нет секса с кодировками, экранировками, множественными рутами и прочей херней, возникающей от большого ума...
                Ответить
                • мне больше нравится
                  I had a problem so I thought to use Java. Now I have a ProblemFactory.
                  Ответить
                  • А мне вот это:
                    So, you have a problem. You say "I know, I'll use floating point!" Now you have 2.0001341678 problems.
                    Ответить
                    • So, you have a problem. You say "I know, I'll use J". Now you +/|:*<.&5j](3#2\3/i.5]).
                      Ответить
              • > вообще никогда ни в одном языке не видел изящный способ работы с XML

                Неужто Linq2Xml неизящен? По сравнению с DOM и прочей лабудой...

                Не менее изящно - использование xml-сериализации/десериализации. Перегоняем данные xml в объекты предметной области - хорошо!

                -----
                В Scala есть XML pattern matching. Погугли, глянь пример. В какой-то мере изящно. Но с непривычки может торкнуть.
                Возможно, немерлисты реализуют подобное...
                Ответить
          • Кстати, а откуда гарантия, что после парсинга строки в XML (7) и перегонки обратно в строку (8) получится то же самое, что было изначально? Из-за этого оно же спокойно может завалиться, если эту псевдо-xml'ку сгенерит другая прога, которая, например, пробелы в других местах ставит, или отступы лишние добавляет, или атрибуты в другом порядке сохраняет...
            Ответить
            • Вы сейчас стоите над дохлой коровой и спорите какое у нее могло бы быть молоко.
              Ответить
          • Вообще в случае с множественными корневыми элементами надо бы использовать XmlReader. Ну так экономнее будет, но не удобнее...
            Ответить
            • Вообще, в случае с множественными корневыми элементами, надо бы взять и уебать автора этой идеи стулом по голове. Так будет эконономнее и удобнее для всех его коллег...

              Я вот пока вижу такую более-менее вескую причину, где это могло бы понадобиться - большой файл, в который довольно часто приписывают все новые и новые xml'ки. В случае ОП'а причина явно не такая ;)
              Ответить
              • Там просто не нужен корневой элемент, вообще ХМЛ может быть не валидный, там уже от предприимчивости и находчивости писателей будет зависеть.

                Иногде просто до автора не добраться, вот, например, автор того, что я сейчас поддерживаю ушел работать в силовые структуры, и сидит в сейфе за семью печатями, за колючей проволкой, взводом ментов с овчарками и все такое - до него никак не дотянуться...
                Ответить
                • > вообще ХМЛ может быть не валидный
                  Одно время мучился, писал редактор для файла с переводами, который должен был быть именно в таком недоиксэмэль, и кодировке 1251 (привет, европа). Кому-то лень было юзать стандартный генератор\парсер, и он сваял свое говно, в котором ни декларации вверху, ни entity вместо &, < и ", и что-то там еще было несовместимое, уже не помню...

                  Короче через обычный парсер это было бесполезно гонять, и пришлось писать свой говнопарсер, совместимый с тем...

                  > ушел работать в силовые структуры
                  Он знал, что за ним придут ;)
                  Ответить
        • > идти работать практологом
          Это от слова "практика"?
          Ответить
    • Гм.. А почему XDocument а не XmlDocument? Какой-нибудь вин-фон?
      Я так понимаю, здесь на XAML издеваются... Вивисекцией пахнет )
      Ответить
      • Никак нет, это LINQ for XML. Гадость редкостная но куда лучше чем дедушкин XmlDocument и иже с ним
        Ответить
        • то, что я тут вижу - те же яйца, только в профиль.
          Ответить
    • catch (Exception ex)
      {
      throw;
      }

      вот это действительно гениально! Человек снипеты умеет юзать -честь ему и хвала.

      нахрена он возвращает пустую строку?
      Ответить
    • input.JavaSubString

      в моем шарпике? ЛОЛКИ

      Метод вообще ничего не меняет и не выводит. Он состояние даже не трогает) ну разве что через CalcCheckDigitCU

      loanCaseComplementNumber не используется даже в пределах метода.
      Ответить
      • > Метод вообще ничего не меняет и не выводит.
        Он может упасть, а может не упасть. Так что 1 бит инфы он все-таки возвращает.
        Ответить
        • Может это такой хитрый способ отрандомить? а там в что то типа

          var maybe = false;
           try
           {
           AddControlDigits(someString);
           }
          catch (Exception)
          {
          maybe = true;
           }
          Ответить
        • если метод будет void, то он может эксепшен рэйзить, если что-то не так будет, который можно адекватно отлавливать, а не как тут :)
          Ответить
    • Фейк.
      JavaSubString - неведомая фигня.
      input = input.Replace - строки неизменяемые, поэтому этот метод ничего не производит.
      Ответить
      • > JavaSubString - неведомая фигня.
        Т.е. экстеншн методы в шарпе уже запретили?

        > строки неизменяемые
        Да там поди при копировании на ГК накосячили: не return "", а return input.
        Ответить
      • так:
        string one = "one";
        one = one.Replace("on", "an");
        Console.WriteLine(one);

        будет ane
        а так:
        string one = "one";
        one = one.Replace("on", "an");
        Console.WriteLine(one);

        будет: one
        Вы это имели ввиду?
        Ответить
        • поправка: во втором случае
          string one = "one";
          one.Replace("on", "an");
          Console.WriteLine(one);
          Ответить
      • >>input = input.Replace - строки неизменяемые, поэтому этот метод ничего не производит.

        OMG

        1 создается новая строка с помощью метода Replace
        2 ссылка на новую строку присваивается input

        Не?
        Ответить
        • guest имеет в виду, что сами строки иммутабельны. А input = input.Replace просто заменил в переменной input ссылку на изначальную строку, на ссылку на результирующую строку. Сама же строка, на которую ссылался input изначально, никак не изменилась, и ее скушает сборщик мусора, если она никому не нужна.

          При этом т.к. аргумент в функцию прилетел не по ссылке (не out и не ref), то и вызывающая функция ничего не заметит.
          Ответить
          • А, он про то, что мол результат через строку возвращается? тогда было бы ref написано
            Ответить

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