|
Ускорить поиск записи в IEnumerable<T>
|
|||
---|---|---|---|
#18+
Здравствуйте. Прошу помочь оптимизировать (ускорить) поиск в IEnumerable<T>. Из базы я загружаю в IEnumerable<T> некую выборку (строк может быть от 0 до 225). Далее я заполняю List<T2> в цикле координатами X и Y, чтобы охватить все адреса для квадрата размером 15*15 (т.е. 225 строк). И в этом цикле каждый раз лезу в IEnumerable<T>.Where(m => m.X == X && m.Y == Y).FirstOrDefault(), чтобы посмотреть - есть ли там запись для этих координат. Т.е. 255 раз лезу в IEnumerable<T>. Этот поиск занимает около 5 сек! Почему так долго? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.06.2013, 16:17 |
|
Ускорить поиск записи в IEnumerable<T>
|
|||
---|---|---|---|
#18+
Andrey_VP, какой реальный тип? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.06.2013, 16:21 |
|
Ускорить поиск записи в IEnumerable<T>
|
|||
---|---|---|---|
#18+
pation, в смысле, расшифровать T? Это класс: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.06.2013, 16:24 |
|
Ускорить поиск записи в IEnumerable<T>
|
|||
---|---|---|---|
#18+
Andrey_VP, подозреваю что ты таким образом запускаешь каждый раз запрос к БД. Преврати IEnumerable<T> в List<T> и это должно помочь. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.06.2013, 16:30 |
|
Ускорить поиск записи в IEnumerable<T>
|
|||
---|---|---|---|
#18+
Напиши тестовый код с заполнением данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.06.2013, 16:31 |
|
Ускорить поиск записи в IEnumerable<T>
|
|||
---|---|---|---|
#18+
5 сек. очень много, вот простой пример поиска элемента 1 тыс. раз. Выполняется меньше секунды. Код: c# 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.06.2013, 16:36 |
|
Ускорить поиск записи в IEnumerable<T>
|
|||
---|---|---|---|
#18+
Хочу уточнить, что тормоза вызывает .FirstOrDefault() Т.е. если эксперементально убрать .FirstOrDefault() из выражения IEnumerable<T>.Where(m => m.X == X && m.Y == Y).FirstOrDefault(), то поиск выполняется мгновенно. Но как быть без ".FirstOrDefault()" ? Мне же надо получить объект класса T. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.06.2013, 16:42 |
|
Ускорить поиск записи в IEnumerable<T>
|
|||
---|---|---|---|
#18+
bazile, спасибо! Ваш способ помог. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.06.2013, 16:47 |
|
Ускорить поиск записи в IEnumerable<T>
|
|||
---|---|---|---|
#18+
Andrey_VP, у тебя за IEnumerable<T> стоит БД. Вызов Where() не означает физического обращения к БД. Оно произойдет когда ты начнешь читать из IEnumerable данные. FirstOrDefault() именно это и делает. Поэтому когда ты его убираешь, то якобы происходит ускорение. Проблема не в нем, а в непонимании тобой отложенной природы "вычисления" подобных выражений. Повторяю свой совет - преобразуй результат запроса БД из IEnumerable<T> в List<T> чтобы все данные гарантированного были в памяти и ищи по ним на здоровье. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.06.2013, 16:50 |
|
|
start [/forum/topic.php?fid=20&fpage=159&tid=1404510]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 152ms |
0 / 0 |