2014-02-17 2 views
1

У меня есть список предметов, который имеет свойство (ProductNames), которое является IEnumberable<string>. Как я могу отфильтровать этот список в свойстве, чтобы получить только список, в котором элемент соответствует всем элементам в другом IEnumerable<string> (FilterProductNames)?Элементы фильтра, основанные на IEnumerable <string>

Я попытался следующие, но это, кажется, возвращает все элементы, которые соответствуют ничего (спичке стиль OR) в пределах фильтра IEnumberable:

Items.Where(x => x.ProductNames.Intersect(FilterProductNames).Any()) 

UPDATE

Я пытался использовать Тима ответьте ниже, но мне кажется, что я дал пустой набор, поэтому я попробовал только один элемент в FilterProductNames, но это все еще просто ничего мне не дало, поэтому я протестировал один и тот же фильтр, выполнив следующие действия:

if (count == 1) 
{ 
    // this will return me 4 items 
    Items = Items.Where(x => x.ProductNames.Contains(FilterProductNames.First())); 
} 
else 
{ 
    // when I remove the above if, this will return me 0 items filtering on the same thing 
    Items = Items.Where(x => x.ProductNames.All(pn => FilterProductNames.Contains(pn))); 

    // have also tried the other version on tim's answer but to no avail: 
    // Items = Items.Where(x => !x.ProductNames.Except(FilterProductNames).Any()); 
} 

UPDATE 2

Извините за плохой формулировки, которая вызвала некоторое замешательство, я после того, как элементы, которые содержат все имена в FilterProductNames, но не ограничиваются только пункты в FilterProductNames так, например, если при поиске для элементов, имеющих названия продуктов Test и Test1, он должен вернуть любой элемент, содержащий как эти имена, так и любое другое имя.

Возможно ли это?

ответ

5

Вы можете использовать Enumerable.All:

Items.Where(x => x.ProductNames.All(pn => FilterProductNames.Contains(pn))) 

или - возможно, более эффективным - с помощью ! ... Except.Any:

Items.Where(x => !x.ProductNames.Except(FilterProductNames).Any()); 

Редактировать соотв. Ваш комментарий/изменить: "... все элементы, которые содержат все имена в FilterProductNames"

Тогда вы должны обратить заявление:

Items.Where(x => FilterProductNames.All(fp => x.ProductNames.Contains(fp))); 

или

Items.Where(x => !FilterProductNames.Except(x.ProductNames).Any()); 
+0

Привет Я просто попробовали оба этих варианта, но оба они возвращают мне пустой набор – Pete

+0

@Pete: я протестировал его с простыми примерными данными, и он работал, как ожидалось. Так что в твоих руках должно быть что-то особенное. Измените свой вопрос и покажите короткий пример, который показывает это неправильное поведение. В противном случае мы могли бы просто догадаться (случай, орфография, пробелы, 'null' и т. Д.) –

+0

Привет, я добавил примеры того, что работает, а что нет, сообщите мне, если вам нужно больше информации – Pete

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