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

    +136.3

    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
    for (int i = 0; i < count; i++) // перебираем список адресов
                    {
                        email = email_list[i].ToString();                   
                        for (int y = i + 1; y < count; y++)  // перебираем тот же список но начиная со следующего элемента
                        {
                            if (email == email_list[y].ToString())
                            {
                                // если такой "y" уже есть в duble_index то пропускать
                                if (!duble_index.Contains(y))                                
                                    duble_index.Add(y); // он дубликат - заносим его в "ЧЕРНЫЙ СПИСОК" =)
                            }
                         }
                      }
    ***************
    
               System.Collections.ArrayList al = System.Collections.ArrayList.Adapter(duble_index);
                al.Sort();
                int z = 0;
                int [] buff = new Int32[duble_index.Count];
                foreach (Int32 s in al)
                {
                    buff[z] = s;
                    z++;
                }
    
                for (int i = buff.Length-1; i >= 0; i--)
                {
                    email_list.RemoveAt(buff[i]);
                }

    Удаление дубликатов в не отсортированном списке.... Это реально упростить?

    Запостил: AndrewKo, 17 Ноября 2009

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

    • да
      Ответить
    • Что мешает отсортировать?
      Ответить
      • это описан способ именно с неотсортированным массивом, иначе проблем не возникает....
        Ответить
    • Решение в лоб :)

      List<string> exists = new List<string>()
      for(int index = email_list.Count-1; index>=0 index++)
      {
      string email = email_list[index];
      if (!exists .Contains(email))
      {
      duble_index.Add(email);
      }
      else
      {
      email_list.emoveAt(index);
      }
      }
      Ответить
      • Точнее

        List<string> exists = new List<string>()
        for(int index = email_list.Count-1; index>=0 index++)
        {
        string email = email_list[index];
        if (!exists .Contains(email))
        {
        exists .Add(email);
        }
        else
        {
        email_list.emoveAt(index);
        }
        }
        Ответить
    • Открою вам тайну, но в LINQ существует метод Distinct:
      email_list.Distinct();
      Ответить
      • опередил ты меня )))
        поддерживаю это решение. Но если пишут на 2.0, 3.0 или Compact?
        Ответить
        • тогда вот так: (расширяющие методы и под 2.0 могут компилятся)

          public static IList<T> Distinct<T>(this IList<T> sourceList)
          {
          List<T> result = new List<T>(sourceList.Count);
          foreach (var item in sourceList)
          if (!result.Contains(item))
          result.Add(item); // yield return
          return result;
          }
          Ответить
          • только лучше IEnumerable<T> для исходного и возращать обычный List (для удобства)
            Ответить
          • Оформить как отдельный метод и нормально.
            Ибо про расширяющие методы в NetFramework 2.0 ты загнул )
            Ответить
            • ничего не загнул, у себя в проектах на 2.0 использую. там маленькая хитрость есть...
              Ответить
              • если кто не знает то после компиляции все разширяющие методы расширяющие методы

                string str;
                str.Foo();

                заменяются на Foo(str);

                Проверено Решарпером ;)
                Ответить
          • Не, это короче написано. Но может автор хотел, чтобы быстрей работало.
            Ответить
            • Да хотел быстрее, потому что то описанный мной способ работает безумно долго...
              Ответить
      • хм... спасибо, попробую
        Ответить
    • Если нужно избавиться от дубликатов -- заведите HashSet и сделайте это за O(n)
      Ответить
    • Вобщем - то вот такая вещчь получилась, без затей... Благодаря первому коменту гостя

      for (int i = 0; i < count; i++) // перебираем список адресов
                      {
                          // присваиваем переменной полученное значение
                          email = email_list[i].ToString();
                          if (!buff_email.Contains(email))
                              buff_email.Add(email);
                      }
                  email_list.Clear();
                  foreach (string s in buff_email)
                  {
                      email_list.Add(s);
                  }

      результаты:
      Извлечено е-mail - 306247
      найдено дубликатов - 9306
      Выполнено за - 17 мин 57 сек


      Интересно другие предложенные способы работают быстрее?
      Ответить
      • Интересно - попробуйте. Минута кодирования.
        buff_email - отменный стиль именования :) И что это? List<>? Т.е. поиск перебором? Сильный ход.
        Ответить

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