Преступник должен быть
filteredList = validAppConfig.Where(m => m.UniqueID == distinctUniqueID);
Во-первых, LINQ Where
- это неэффективный метод с линейной временной сложностью O (N). Использование таких методов внутри циклов не рекомендуется.
Во-вторых, из-за отложенного выполнения LINQ вышеупомянутый линейный поиск выполняется несколько раз - в основном каждым оператором, применяемым к filteredList
- filteredList?.Count()
, filteredList.First()
и 2 filteredList.ToDictionary(…)
звонков.
Что вы можете сделать, это подготовить заранее структуру данных быстрого поиска на основе ha sh (например, Lookup ) вне l oop и используйте его внутри.
например, добавьте что-то подобное за пределами l oop:
var validAppConfigsByUniqueID = validAppConfig.ToLookup(m => m.UniqueID);
и внутри замените
filteredList = validAppConfig.Where(m => m.UniqueID == distinctUniqueID);
if (filteredList?.Count() > 0)
на
var filteredList = validAppConfigsByUniqueID[distinctUniqueID];
if (filteredList.Any())
Обратите внимание, что операция validAppConfigsByUniqueID[distinctUniqueID]
имеет постоянную сложность по времени O (1). И возвращаемое перечислимое уже буферизовано, поэтому повторение его несколько раз не является проблемой.