Есть ли лучший или более эффективный способ фильтрации с помощью linq - PullRequest
3 голосов
/ 11 декабря 2011

У меня есть коллекция, которая содержит коллекцию атрибутов. Каждый атрибут имеет тип и идентификатор. Мне нужно отфильтровать коллекцию, где идентификаторы атрибутов находятся или будут в группе типов атрибутов, но типы атрибутов есть и будут. Я придумал следующее и подумал, есть ли лучший способ.

foreach (var ag in andAttrGrpIds)
{
  filteredModels = filteredModels.Where(x => x.ProductAttributes.Any(pa => pa.AttributeType==ag && orAttributes.Contains(pa.AttributeId))).ToList();            
}

В приведенном выше фрагменте, и атрибуты AtrGrpIds и orAttributes являются массивами строк.

1 Ответ

2 голосов
/ 11 декабря 2011

Я бы сделал:

var filteredModels = from model in originalModels

                     let mAttribs = from pa in model.ProductAttributes
                                    where orAttributes.Contains(pa.AttributeId)
                                    select pa.AttributeType

                     where !andAttrGrpIds.Except(mAttribs).Any()

                     select model;

Теперь это более читабельно и (вероятно) имеет лучший профиль производительности.

Идея состоит в том, чтобы получить набор всех «подходящих» типов атрибутов продукта из каждой модели, а затем проверить, присутствуют ли все andAttrGrpIds в этом наборе.

Кстати, ваши соглашения об именах кажутся довольно странными: коллекция andAttrGrpIds, по-видимому, фактически представляет коллекцию атрибутов - типов .

...