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

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    var languageCodes = locales
                    .GroupBy(l => l.Key.Substring(0, 2))
                    .Select(group => group.First())
                    .Select(l => new KeyValuePair<string, string>(l.Key.Substring(0, 2), l.Value))
                    .OrderBy(l => l.Value);

    Прислала боевая подруга из Канады. Да, это продакшен. Но на этот раз код не падавана, а её собственный.

    Запостил: kerman, 19 Мая 2016

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

    • В чем говно?
      Ответить
    • в том что это С#
      Ответить
    • >new KeyValuePair<string, string>(l.Key.Substring(0, 2), l.Value)
      А кто там недавно втирал что C# умеет типы выводить похлеще жабы?
      Ответить
      • >>var languageCodes
        как видишь -- умеет.

        Погугли уже "вывод типов", стыдно не знать что это такое
        Ответить
        • >Погугли уже "вывод типов"
          > <string, string>

          >var
          Иди напитонjs, гость.
          https://projectlombok.org/features/val.html
          Ответить
          • Здесь тебе никто ничего и не общеал.
            Ответить
            • О. Поехавший пидар появился.
              Ответить
            • В смысле вывод типов в этом месте тебе никто не обещал - а может тебе интерфейс захочется указать вместо типа? В var такое тоже может быть. В общем, хз. Ты же у нас умный, вот и придумай, почему в варе сделали вывод, а тут нет, да еще и нельзя не указывать типы как в жавке.

              Могу предположить, что аргументы в конструкторе коллекций в решетке необязательны. В общем, 3.14159265, пошел на стековерфлоу гуглить, 3.14159265!
              Ответить
          • Ты реально дебил. Ты даже не осилил почитать что такое "вывод типов".
            Ответить
            • >Ты реально дебил. Ты даже не осилил почитать что такое "вывод типов".

              Мне очень важно твоё мнение.
              Ответить
              • Ладно, если ты такой неудачник, я тебе объясню.

                В C# статическая типизация, и тип выражения язык умеет вычислять. Потому тип переменной можно не указывать. Можно написать "var foo = 1;" и C# поймет что foo это 1.

                Это и называется "вывод типов".
                Джава так не умеет, а C# умеет.

                JS тут не причем, совершенно непонятно нахя ты его сюда приплел. Видимо ты увидел знакомое слово.
                Ответить
      • Я просто оставлю это здесь: http://ideone.com/ULgtJd

        Интересно, а в шарпе так можно?
        Ответить
        • Не знаю, что именно подразумевалось под "так", но вот:

          http://ideone.com/Reoz4Y
          Ответить
          • Ну вот, значит просто автор ГК ниасилил шарпик:
            - .Select(l => new KeyValuePair<string, string>(l.Key.Substring(0, 2), l.Value))
            + .Select(l => KeyValuePair.Create(I.Key.Substring(0, 2), l.Value))
            Ответить
            • >автор ГК ниасилил шарпик:
              А вообще-то KeyValuePair != Tuple

              >KeyValuePair.Create(I.Key.Substring(0 , 2), l.Value))
              Compilation error
              error CS0117: `KeyValuePair' does not contain a definition for `Create'

              ЫЫЫ
              Ответить
              • Ну хелпер типа крестового std::make_pair можно написать... При вызове функций типы то выводятся, если верить коду guest'а.

                Интересно, зачем сделали отдельный KeyValuePair, если есть Tuple? Только ради семантичненьких Key и Value?
                Ответить
                • struct

                  >хелпер типа крестового std::make_pair можно написать
                  Отличный вывод!
                  Ответить
                  • > struct
                    Ох блядь, неужели к ним царь устроился?
                    Ответить
                    • Ну мне один сишарпер с пеной у рта рассказывал что "оно на штеке! жаба ниумеит!".

                      Попытки пояснить что jit маленькие объекты умеет сама, без всяких хинтов на стек запихивать, равно как инлайнить методы без мусорных кейвордов, успехом не увенчались.
                      Ответить
                      • > маленькие объекты
                        Жабий JIT их реально на стек запихивает, или просто на поля разъябывает, инлайнит методы к хуям и выкидывает лишний код и нинужные поля?
                        Ответить
                        • http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html#escapeAnalysis
                          Ответить
                      • Джит может разместить, а может и нет. Это его дело.
                        JLS-же не дает программисту управлять этим, да и JVM тоже.

                        А в C# управлять можно. Так, структуру (value type) можно разместить на стеке.
                        Ответить
                • можно так. например

                  http://ideone.com/FAp3vg
                  Ответить
                • Шарп, сука, умный

                  http://ideone.com/ELoDLq
                  Ответить
                  • И так тоже тру:
                    http://ideone.com/If8fo5

                    А так фолс, потому что тип второго поля не совпал:
                    http://ideone.com/KVFol8

                    И так фолс, потому что у второго поля название не совпало:
                    http://ideone.com/PQ9X1C

                    И так фолс, потому что порядок не совпал:
                    http://ideone.com/iCB9Xw

                    По сравнению с более старыми компиляторами Шарп действительно умный, потому что умеет объединять в один типы, у которых названия, типы и порядок компонентов совпадают.
                    Ответить
                    • хм, я думал, что порядок значения не имеет...
                      Ответить
                      • Спасибо ему хоть на этом.

                        Турбо Паскаль типы с одинаковой сигнатурой считал разными, если они не объединены тайпдефом. Например, вот так всё работало:
                        type
                          Massiv = array[0..15] of byte;
                        var
                          A: Massiv;
                          B: Massiv;
                        begin
                          A := B      (* A и B одинакового типа *)
                        end.
                        А вот так не компилировалось:
                        var
                          A: array[0..15] of byte;
                          B: array[0..15] of byte;
                        begin
                          A := B (* компилятор выругается, потому что считает, *)
                                 (* что у A и B разные типы *)
                        end.


                        Кстати, почему в Шарпе порядок имеет значение? Почему имеет значение порядок полей в сишном типе struct и в паскалевском типе record, понятно: там доступ происходит по физическому смещению от начала записи. Изменишь порядок и смещения будут другими. А в Шарпе как реализован тип {key, value}?
                        Ответить
                        • >> Кстати, почему в Шарпе порядок имеет значение? Почему имеет значение порядок полей в сишном типе struct и в паскалевском типе record, понятно: там доступ происходит по физическому смещению от начала записи

                          На самом деле в шарпе тоже, только компилятор сам выбирает положение полей. Можно атрибутом поменять положение.
                          Хз почему они разные. Видимо из-за скорости выполнения. Если бы он просматривал все поля на соответствие, это могло бы занять много времени, бла-бла-бла.
                          Ответить
            • Прально, но это мелкая оптимизация, говно не в этом.
              Ответить
              • так в чем говно-то?
                Ответить
              • Да не догадаются они не в жизнь без батьки.
                linq обрабатывает одну строку после -> .Select(group => group.First())
                Минусует только быдло, не способное в шарп, linq, и подобное.

                Борманд придумавает велосипеды, хотя есть ToDictionary()

                А пи до сих пор думает, что он программист.
                Ответить
                • Да и кстати, забыл, само наличие двух селектов, можно было просто First() сделать после GroupBy() и тогда всем должно стать все понятно.
                  Ответить

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