| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > Найти дубли в массиве |
| Автор: Suppir 17.1.2012, 14:12 | ||
Вводу строки в richTextBox1. Нужно найти одинаковые строки:
Если строк мало, то вроде работает. Но если строк несколько тысяч, то зависает. Подскажите, как лучше написать этот код? |
| Автор: VSB 22.1.2012, 11:52 | ||
|
| Автор: Suppir 30.1.2012, 16:52 |
| VSB, у меня проект под .NET Framework 2.0. В нем нет линка. |
| Автор: diadiavova 30.1.2012, 23:51 | ||
Suppir, попробуй так
Если будет тормозить, можно будет еще попробовать просто удалять повторяющиеся строки в процессе обхода, но не знаю, будет ли это быстрее. |
| Автор: Suppir 31.1.2012, 08:19 | ||
в первом посте я пробовал а-ля Perl, поиск через хеш (если в хеше есть такой элемент, то выводим).
|
| Автор: mihryak 31.1.2012, 11:52 | ||
Потери на приведении типов несравнимо меньше, чем пробег по коллекции со сравнением искомой строки с (потенциально) всеми остальными. Хешированые коллекции требуют O(1) для поиска (для того, чтобы не получить потери на добавлении, нужно правильно задать изначальный Capacity, тогда и добавление будет O(1)), в отличие от O(N) у простого List<>. Можно попробовать использовать Dictionary и сравнить его производительность с Hashtable. Но несколько тысяч строк - вообще ни о чём, какая коллекция бы ни использовалась, поиск дублей будет мгновенным. Тут, как правильно ответил diadiavova, проблема скорее в многократный вызовах AppendText. |
| Автор: diadiavova 31.1.2012, 12:53 | ||
Ну я как бы и не предлагал сравнивать производительность List.Find и Hashtable.ContainsKey. |
| Автор: mihryak 31.1.2012, 12:59 | ||
Ну ок, я просто увидел критику скорости Hashtable и использование List.Find вместо него, это выглядело как показ более подходящей альтернативы. Кроме того. не стоит в этом видеть личный "наезд", я скорее отписался, потому что здесь - раздел "Для новичков", так что такое пояснение показалось не лишним. |
| Автор: diadiavova 31.1.2012, 13:12 | ||
Да нет, я просто упомянул, что этот класс слегка устарел вот и все. И в мыслях не было, да и информация полезная и уместная. |
| Автор: VSB 3.2.2012, 18:07 |
| diadiavova, и всё же, зачем тут вообще использовать небыстрый AppendText вместо создания списка строк и отправки его в richTextBox1.Lines ? Suppir, а что не дает поднять уровень проекта до 3.5? |
| Автор: diadiavova 3.2.2012, 19:38 | ||
Не понял. Пример можно? |
| Автор: VSB 3.2.2012, 20:19 |
| diadiavova, вместо richTextBox1.AppendText(string.Join("\r\n",result.ToArray())); использовать сразу richTextBox1.Lines=result.ToArray(); |
| Автор: mihryak 9.2.2012, 18:54 |
| VSB, твой код иначе работает - у топик стартера в RTB останется оригинальный текст, а под ним появятся найденные дубликаты; твой же код уберёт оригинальный текст т.к. телепатов не бывает, вопросы о производительности по умолчанию подразумевают, что внешний результат останется тем же Добавлено через 22 секунды блин, на дату не посмотрел, простите |
| Автор: VSB 10.2.2012, 20:02 |
| mihryak, нене у топикстартера есть richTextBox1.Clear(); и все равноЮ, лучше наверное делать Lines.Add() чем строки складывать. //впрочем, не мерил |