2012-04-01 3 views
0

Мне нужен список из OldGuids, которые не находятся в NewGuids, поэтому я использовал метод Contains, проблема в том, что он уже работает более чем на полчаса, есть ли более быстрый способ? или сколько еще потребуется?Оптимизация Linq Содержит метод

Dim OldGuids As New List(Of Guid) ' 18 million rows 
Dim NewGuids As New List(Of Guid) ' 6 million rows 
Dim Filtered = From n In OldGuids Where Not NewGuids.Contains(n) 
+2

1 апреля? Это взято: http://stackoverflow.com/questions/1705008/simple-proof-that-guid-is-not-unique –

+0

спасибо за ссылку .. – Ezi

ответ

2
Filtered = OldGuids.Except(NewGuids) 

(Обратите внимание, что это будет возвращать только уникальные элементы, если вы хотите сохранить дубликаты это не то, что вы хотите).


var newGuidSet=new HashSet<Guid>(newGuids); 
Filtered = OldGuids.Where(g=>!newGuidSet.Contains(g)); 
+0

будет ли он намного быстрее, чем содержит? – Ezi

+0

Он будет быстрым, но займет около 400 МБ или ОЗУ. – CodesInChaos

+0

Я получаю из системы исключение из памяти, на жестком диске много места – Ezi

3

Вы должны использовать HashSet<Guid> s.

Вы можете написать OldGuids.IntersectWith(NewGuids)

+0

'IntersectWith' здесь не помогает. Вы пропустили «нет» в вопросе. – CodesInChaos

+0

Метод, который следует использовать, это 'ExceptWith', а не' IntersectWith' –