你做錯的主要原因是你不會把結果賦給某個東西。這就是爲什麼你的原創似乎讓所有的客戶。但是,我們仍然可以提高原始:
filteredClients = filteredClients.Where(n => !jobsToSearch.Any(j => j.Client == n.ClientId)).ToList();
這和你.Count()
解決方案之間的不同之處在於.Any()
能儘快停止尋找與每一個客戶的任務列表中,因爲它遇到的第一個對手,所以它應該運行快一點。但我們還沒有完成。通過使用HashSet,它可以使O(1)查找像Dcitionary
var badClients = jobsToSearch.Select(j => j.Client).Distinct().ToList();
filteredClients = filteredClients.Where(n => !badClients.Any(j => j == n.ClientId)).ToList();
而且可能甚至更好:我們可以做的,甚至通過縮小的工作做得更好列表下降到僅不同的客戶。假設客戶端ID是一個int:
var badClients = new HashSet<int>(jobsToSearch.Select(j => j.Client));
filteredClients = filteredClients.Where(n => !badClients.Contains(n.ClientId)).ToList();
這是否最後選擇性能更好取決於有工作的客戶端數量......如果列表短,.Distinct()仍可能做的更好。
最後,我通常不建議像這樣調用.ToList()
。儘可能地保存實際的List,Array或collection類型,直到最後一刻,並儘可能長時間保持爲Enumerable。
是j.Client和n.ClientID整數嗎? –
您確定'jobsToSearch'查詢是否正確?你的代碼看起來應該做你打算做的事情。如果它不優化也不會幫助你。 –
你永遠不會把結果分配給任何東西。 '.Where()'返回一個新的序列。它不會修改現有的序列。 –