Главное, что вы делаете неправильно, так это то, что вы не возвращаете результаты к чему-то. Вот почему ваш оригинал, казалось, держал всех клиентов. Но мы все еще можем улучшить оригинал:
filteredClients = filteredClients.Where(n => !jobsToSearch.Any(j => j.Client == n.ClientId)).ToList();
Разница между этим и вашим решением .Count()
что .Any()
может перестать смотреть на список заданий с каждым клиентом, как только он встречает первый матч, поэтому он должен работать немного быстрее. Но мы еще не закончили. Мы можем сделать еще лучше за счет сужения рабочих мест список вниз только отдельных клиентов:
var badClients = jobsToSearch.Select(j => j.Client).Distinct().ToList();
filteredClients = filteredClients.Where(n => !badClients.Any(j => j == n.ClientId)).ToList();
и, вероятно, даже еще лучше с помощью HashSet, что может сделать O (1) Lookups как в Dcitionary. Если предположить, что идентификатор клиента является INT:
var badClients = new HashSet<int>(jobsToSearch.Select(j => j.Client));
filteredClients = filteredClients.Where(n => !badClients.Contains(n.ClientId)).ToList();
ли выполняет это последний вариант лучше, зависит от количества клиентов, имеющих рабочие места ... если список короткий, .distinct() может еще лучше.
И, наконец, я обычно не рекомендую звонить .ToList()
следующим образом. В максимально возможной степени сохраните фактическое представление списка, массива или типа коллекции до последнего момента и просто сохраните его в Enumerable как можно дольше.
являются j.Client и n.ClientID целыми числами? –
Вы уверены, что запрос 'jobToSearch' верен? Ваш код выглядит так, как будто он должен делать то, что вы намерены делать. Если это не оптимизация, это тоже вам не поможет. –
Вы никогда не присваиваете результаты ни к чему. '.Where()' возвращает новую последовательность. Он не изменяет существующую последовательность на месте. –