Си диез / Говнокод #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 kerman, (Updated )

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

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

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

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

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

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

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

              JS тут не причем, совершенно непонятно нахя ты его сюда приплел. Видимо ты увидел знакомое слово.
              Ответить
        • Ну вот, значит просто автор ГК ниасилил шарпик:
          - .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 можно написать
                Отличный вывод!
                Ответить
                  • Ну мне один сишарпер с пеной у рта рассказывал что "оно на штеке! жаба ниумеит!".

                    Попытки пояснить что jit маленькие объекты умеет сама, без всяких хинтов на стек запихивать, равно как инлайнить методы без мусорных кейвордов, успехом не увенчались.
                    Ответить
                • И так тоже тру:
                  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() и тогда всем должно стать все понятно.
                Ответить

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

Семь раз отмерь — один отрежь, guest!

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


    8