powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Ускорить поиск записи в IEnumerable<T>
10 сообщений из 10, страница 1 из 1
Ускорить поиск записи в IEnumerable<T>
    #38296474
Andrey_VP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Прошу помочь оптимизировать (ускорить) поиск в 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 сек! Почему так долго?
...
Рейтинг: 0 / 0
Ускорить поиск записи в IEnumerable<T>
    #38296485
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey_VP,

какой реальный тип?
...
Рейтинг: 0 / 0
Ускорить поиск записи в IEnumerable<T>
    #38296492
Andrey_VP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
 public class Letter
    {
        public int ID { get; set; }
        [Required]
        public int ID_F { get; set; }
        [Required]
        [MaxLength(1)]
        public string L { get; set; }
        [Required]
        [Range(0,15)]
        public int X { get; set; }
        [Required]
        [Range(0, 15)]
        public int Y { get; set; }
        [MaxLength(20)]
        public string U { get; set; }
        [MaxLength(1)]
        public string SL { get; set; }
        [Required]
        [Range(0, 15)]
        public int SR { get; set; }
        [Required]
        [Range(0, 15)]
        public int SC { get; set; }
        [Required]
        public bool isNew { get; set; }
        [Required]
        public bool isSel { get; set; }
        [MaxLength(30)]
        public string W { get; set; }
    }
...
Рейтинг: 0 / 0
Ускорить поиск записи в IEnumerable<T>
    #38296508
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey_VP, подозреваю что ты таким образом запускаешь каждый раз запрос к БД. Преврати IEnumerable<T> в List<T> и это должно помочь.
...
Рейтинг: 0 / 0
Ускорить поиск записи в IEnumerable<T>
    #38296509
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напиши тестовый код с заполнением данных.
...
Рейтинг: 0 / 0
Ускорить поиск записи в IEnumerable<T>
    #38296520
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5 сек. очень много, вот простой пример поиска элемента 1 тыс. раз. Выполняется меньше секунды.

Код: c#
1.
2.
3.
4.
5.
var employees = Enumerable.Range(1, 1000).Select(d => new Employee { EmployeeId = d, FirstName = "Test" + d });
foreach (var employee in employees)
{
    var search = employees.SingleOrDefault(d => d.EmployeeId == employee.EmployeeId);
}
...
Рейтинг: 0 / 0
Ускорить поиск записи в IEnumerable<T>
    #38296531
Andrey_VP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу уточнить, что тормоза вызывает .FirstOrDefault()
Т.е. если эксперементально убрать .FirstOrDefault() из выражения IEnumerable<T>.Where(m => m.X == X && m.Y == Y).FirstOrDefault(), то поиск выполняется мгновенно.
Но как быть без ".FirstOrDefault()" ? Мне же надо получить объект класса T.
...
Рейтинг: 0 / 0
Ускорить поиск записи в IEnumerable<T>
    #38296538
Andrey_VP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bazile, спасибо! Ваш способ помог.
...
Рейтинг: 0 / 0
Ускорить поиск записи в IEnumerable<T>
    #38296544
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey_VP, у тебя за IEnumerable<T> стоит БД. Вызов Where() не означает физического обращения к БД. Оно произойдет когда ты начнешь читать из IEnumerable данные. FirstOrDefault() именно это и делает. Поэтому когда ты его убираешь, то якобы происходит ускорение. Проблема не в нем, а в непонимании тобой отложенной природы "вычисления" подобных выражений. Повторяю свой совет - преобразуй результат запроса БД из IEnumerable<T> в List<T> чтобы все данные гарантированного были в памяти и ищи по ним на здоровье.
...
Рейтинг: 0 / 0
Ускорить поиск записи в IEnumerable<T>
    #38296577
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я чё-та не понял, какой нах IEnumerable, если речь об ленивом IQueryable? Автор нас обманывал.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Ускорить поиск записи в IEnumerable<T>
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]