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

    +129.9

    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
    public static void ClearUsers()
            {
                var toremove = new List<string>();
                foreach (var user in SignedUsers.Values)
                {
                    if (!user.IsActive)
                        toremove.Add(user.UserName);
                }
                foreach (var usr in toremove)
                {
                    SignedUsers.Remove(usr);
                }
    
            }

    Удаление юзера

    Запостил: DavidM, 04 Сентября 2009

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

    • И в чем проблема, собственно?
      Ответить
      • Да да, где гавно код?
        Есть более красивое решение, но это не делает это гавнокодом.

        Просьба автора переписать этот код по его религии, вот мы и посмотрим :)
        Ответить
        • а за один цикл и без доп массивов уже неправославно кодить?
          Ответить
          • Не будьте голословным, напишите пример ;)
            Ответить
    • внутри foreach по листу нельзя удалять элементы этого листа, поэтому и дополнительный лист, лучше конечно
      это было сделать через for с обходом с конца, но и так пойдет
      Ответить
      • Ну зачем же вы все рассказали, тут можно было кучу народа потроллить :)))
        Ответить
      • Даже не важно - по листу или нет. Удалять элементы из коллекшена, пробегая по нему итератором - вот это говнокод. Хорошо что встроенные в BCL коллекшены этому уделяют внимание :)
        Ответить
        • >Удалять элементы из коллекшена, пробегая по нему итератором - вот это говнокод
          это с какого перепоя? если мне нужно именно один раз пробежать и удалить, то почему бы и нет?
          Ответить
          • Не понимаю в чем вопрос. Почему неследует в теле цикла использующего итератор удалять элемент из итерируемого коллекшена?

            Потому что это неявно основывается на знании внутренней реализации итератора для конкретного коллекшена, что явно противоречит принципу инкапсуляции.
            Ответить
      • А это и не лист, а дикшенари, так что через for вообще не получится.
        Ответить
    • Возможно через несколько лет, когда LINQ войдёт в моду, это будет считаться говнокодом.

      Array.ForEach(SignedUsers.Values.Where(u ser => user.IsActive).ToArray(), user => SignedUsers.Remove(user.UserName));
      Ответить
    • list.RemoveAll(n => n.IsActive);
      Ответить
      • Это Dictionary (см. SignedUsers.Values), а он такого, увы, не имеет.
        Ответить
        • ну тогда dict.ToList().RemoveAll(n=>n.IsActive); :)
          Ответить
          • А в дикшенари-то всё останется. ToList() создаст копию. Я бы так сделал:
            foreach (var user in SignedUsers.Values.Where(u => !u.IsActive).ToArray())
            SignedUsers.Remove(user);
            Ответить
    • Вот правильный код. Проверено, работает. Красиво и без лишнего... кода :)

      public static void ClearUsers()
      {
      foreach (var user in SignedUsers.Values)
      {
      if (!user.IsActive)
      SignedUsers.Remove(user.UserName);
      }
      }
      Ответить
      • не работает
        Ответить
      • Этот код целиком и полностью основывается на том, что известно, что проперти Values создает новый коллекшен, а не возвращает рид-онли враппер на внутренний.
        Также он зависит от текущей реализации проперти Values: он возвращает дисконнектед коллекшен - т.е. при изменении дикшенари этот коллекшен не меняется...

        Короче говоря, код, вероятно, и работает, но с точки зрения ООП он неправильный.
        Ответить
    • В общем, нехуй злоупотреБлять новомодными "var"ами... :E
      Ответить
    • Код как код. Во многих местах дефолтный. Человек уже применяет var, но набивает по привычке, оставшейся с прошлых версий шарпа. Сейчас нормальный вариант Dimarius'а
      Ответить

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