2014-02-10 3 views
3

Объясню это на примере.Оптимизированный способ выбора элементов из коллекции, исключая список определенных элементов, используя Linq

Пусть У меня есть список Студенческого объекта, где студент класс,

class Student 
{ 
    public int RollNo {get; set;} 
    public string Name { get; set; } 
    public int StateId { get; set; } 
} 

и список, содержащие специальные StateIds

List<int> specialStateIds; 

Теперь я хочу, чтобы извлечь Список RollIds из списка студентов, которые не принадлежит специальным государствам. В настоящее время я делаю это следующим образом.

List<int> NonSpacialRollIds = Students.Where(s => 
     !specialStateIds.Contains(s.StateId)).Select(s => s.RoleIds).ToList(); 

Но почему-то я чувствую, может быть оптимизировать дальнейшее использование Linq и содержит метод расширения коллекций можно избежать.

+0

Если 'specialStateIds' уже отсортирован, и «Студенты» сортируются по «StateId», тогда некоторый код не Linq может сделать это эффективно, но если они не отсортированы, то ответ Сергея будет правильным. – Dialecticus

+1

@ Dialecticus: содержит ли «Содержит» двоичный поиск внутри? любая альтернатива «Содержит»? – kushdilip

+1

'HashSet.Contains' выполняет некоторые вычисления. Объяснение не может быть простым и всеобъемлющим. Начните с [wikipedia] (http://en.wikipedia.org/wiki/Hash_table). Вы платите больше времени при создании 'HashSet', но вы получаете время при его использовании. – Dialecticus

ответ

4

Вы можете создать набор государственных идентификаторов для более быстрого поиска, поскольку Contains() операция по хэш-множества O (1) и Contains в списке является O (N):

HashSet<int> ids = new HashSet<int>(specialStateIds); 

List<int> NonSpacialRollIds = Students.Where(s => !ids.Contains(s.StateId)) 
             .Select(s => s.RoleIds) 
             .ToList(); 
+1

Черт, слишком быстро, вы не ленитесь * (lazyberezovsky) * больше: P – Habib

+0

Не могли бы вы объяснить, почему ваш метод лучше? – kushdilip

+1

@Sergey: Спасибо за объяснение. – kushdilip

Смежные вопросы