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

    +943

    1. 1
    таблица.ячейки.Where(ячейка => ячейка.выбрана).ToList().ForEach(ячейчка => ячейчка.ОчиститьЗначение());

    Похоже, у автора сама цель усложнить понимание кода и использовать LINQ. Я бы написал так:
    foreach (var ячейка in таблица)
    if (ячейка.выбрана)
    ячейчка.ОчиститьЗначение();

    Запостил: Dimarius, 22 Апреля 2015

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

    • На дворе ж 2015 год, все эти бойлерплейтовские ООПешные конструкции теперь в прошлом. Билдеры и ФП нынче в моде.
      Ну и да, читать Steam API LINQ проще, чем парсить в мозгу твой навороченный foreach(..) if (..) doSmth();
      Ответить
      • >чем парсить в мозгу твой навороченный foreach(..) if (..) doSmth();
        Скажите пожалуйста а что навороченного в цикле с условием? Адепт LINQ в треде. Все в assParallel!
        Ответить
        • лишние переменные, частно одним if-ом не ограничивается, ФП проще читается
          Ответить
          • так, декларативщину с функциональщиной не путайте
            Ответить
          • Не всё то ФП что с лябда-выраженями
            Ответить
            • все равно лучше читается
              Ответить
              • субъективно
                Ответить
                • ну, динозаврам проще с for+if, согласен
                  Ответить
                  • охохо,

                    значит модно-молодежно?

                    ну тогда печаль, я в 23 стал динозавром
                    Ответить
                    • Осознай греховность unsafePerformIO, заверни богохульные помыслы в ST-монаду и в исступлении склони колени перед ФП-богом Стасом, динозавр
                      Ответить
                      • Ты прав, надо расти в этом направлении. Все никак не соберусь добить хаскелль. А то так и умру не элитарным
                        Ответить
                        • Ещё не забудь прочитать древнеегипетскую Книгу Мёртвых, а то не будешь знать, что делать после того, как умрёшь.
                          Ответить
                          • Я прочитал Кастанеду, меня после смерти ждет Орел
                            Ответить
                            • >>меня после смерти ждет Орел
                              Апостол Павел читает эти строки, и у него facepalm.

                              http://muzofon.com/search/%D1%81%20%D0%BF%D1%80%D0%B8%D1%87%D0%B0%D0%BB%D0%B0%20%D1%80%D1%8B%D0%B1%D0%B0%D1%87%D0%B8%D0%BB%20%D0%B0%D0%BF%D0%BE%D1%81%D1%82%D0%BE%D0%BB%20%D0%B0%D0%BD%D0%B4%D1%80%D0%B5%D0%B9
                              Ответить
        • Я, как шарпираст и сыкульщик, говорю - не смешивайте 2 этих языка.

          Цикл с условием приятнее и богоугоднее

          Но все же в одном случае линк лучше - если это адошка и "таблица" лежит в бд. Тогда линк в сыкуль превратится
          Ответить
          • да с чего ты решил, что он приятнее и богоугоднее?
            этот linq по сути разворачивается в такой же цикл с теми же условиями.
            давай, расскажи мне, как это
            var sortedWords = 
                            words3.OrderBy(a => a.Field<string>("word").Length) 
                            .ThenByDescending(a => a.Field<string>("word"), new CaseInsensitiveComparer());
            ты бы писал без linq? или это
            var smallOrders =
                            from c in customers
                            from o in orders
                            where c.Field<string>("CustomerID") == o.Field<string>("CustomerID") &&
                                o.Field<decimal>("Total") < 500.00M
                            select new {CustomerID = (string) c["CustomerID"], OrderID = (int) o["OrderID"], Total = (decimal) o["Total"]};
            Ответить
      • Структурированный код всё же читается легче, чем длинная последовательность вызовов, расположенных в одну строчку. Её хотя бы надо написать в 3 строчки, чтобы не искать глазами, где закрываются и открываются какие скобки.
        Но самое страшное тут не это, а то, что автор создаёт из выбранных значений список только из-за того, что в нём есть нужный метод ForEach, а в общем LINQ его нету.
        Ответить
        • Да, пожалуй лучше было бы через for() if()..
          Хотя все равно не настолько говнокод, чтобы как-то обращать внимание на это. Отрефакторил и дальше пошел
          Ответить
    • foreach (var cell in table.Cells.Where(c=>c.selected))
      {
        cell.ClearValue();
      }

      и никаких if не нужно
      Ответить
      • >>ClearValue

        ЯсноеЗначение

        А почему не erase?
        Ответить
        • Можно Clear(). А вот в сочетании с существительным Clear действительно большое похоже на прилагательное, а не на глагол.
          Ответить
          • MS Way
            https://msdn.microsoft.com/ru-ru/library/system.windows.dependencyobject.clearval ue(v=vs.110).aspx
            Ответить
          • На английском любой текст выглядит, как говнокод, потому что даже часть речи определить невозможно, не говоря уже о значении.

            Кстати, меня радует, что в русской версии Blue Stacks кнопку «Close» перевели как «Близко». Глагол, наречие, прилагательное, категория состояния — какая разница?
            Ответить
            • Вы действительно хотите установить это приложение?
              Окей, Компостер, Близко
              Ответить
              • Компостер близко! Бегите, глупцы!
                Ответить
                • Не так страшен компостер, как табун коней.
                  Ответить
    • Форчан обычно в линькью запросе не нужен. Это сразу превращает фп в императивную питушню
      Ответить
    • Єто ересь уже потому, что там присутствует ToList() не в том месте
      Ответить
      • Это потому что ForEach есть только у List'а.
        Ответить
        • А почему нету у iterable?
          Ответить
          • http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx
            Потому что побочные действия не сочетаются с идеологией linq.
            Ответить
            • В жавке сочетается, правда имя хуевое
              https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#peek-java.util.function.Consumer-
              Ответить
    • я понял¸ зачем русские названия - допустить грамматическую ошибку опечатку легче. возможно, это способствует изучению родного языка.
      Ответить
    • Ну и зря, в шарпе такая прелесть как линк есть, компактно писать, а ты а ля паскаль. То что ты трудно линк выражения воспринимаешь проблема в тебе
      Ответить
      • Не надо делать поспешных умозаключений. Я знаю линк получше автора кода и знаю, где он уместен, а где - нет. И на счёт компактности в этом конкретном примере можно поспорить.
        Ответить
        • а что ж ты тогда нормальный, понятный код переписал а ля паскаль
          Ответить
          • Код действительно понятный и корректный. Проблема в том, что он корявый и неэффективный. Для того, чтобы произвести действия над элементами коллекции, создаётся копия этой коллекции в виде списка (ToList). При больших размерах коллекции и частых обращениях к коду такой подход вызовет большую нагрузку на процессор и сборщик мусора. Ну и ещё раз: коряво это. Если нравится так писать, он мог бы написать свой метод расширения для IEnumerable, а не превращать коллекцию в List только ради того, что там такой метод есть. И вообще, LINQ не поощряет изменения данных, к которым применяется.
            Ответить

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