Фильтрация коллекции элементов из содержимого другой коллекции - PullRequest
3 голосов
/ 03 апреля 2009

Раньше это работало для меня, а потом не получилось. Я хочу вернуть только те элементы, которые содержат все фильтры, а не хотя бы один фильтр, как сейчас. Что здесь не так?

private IQueryable<IndexItem> FilteredIndex (IQueryable<IndexItem> index, IEnumerable<string> filters)

    {

        var filteredIndex= from f in filters.AsQueryable() 
               where f.Length>0
               from i in index 
               where i.FilterNames.Contains(f)
               select i;
        return filteredIndex;
   }

Ответы [ 3 ]

3 голосов
/ 03 апреля 2009

Прямо вперед. Для данного элемента из индекса убедитесь, что для всех фильтров верно, что данный элемент содержит фильтр. При этом просто выберите все элементы из индекса, для которых данное условие истинно.

index.Where(item => 
   filters.All(filter => item.FilterNames.Contains(filter)))

Я не уверен, требуется ли проверка длины больше нуля, гайка легко интегрируется.

index.Where(item => 
   filters.All(filter =>
      (filter.Length > 0 ) || (item.FilterNames.Contains(filter))))

Он работает с LINQ to Objects, и я думаю, он делает то, что вы хотите, но я не уверен, работает ли он с LINQ to SQL.

1 голос
/ 03 апреля 2009

Переверни. То, что вы хотите, это те элементы в индексе, где каждый элемент в FilterNames имеет соответствующую запись в фильтрах. Я не уверен, насколько это было бы эффективно, но сравнение подсчета должно подойти. Что-то вроде:

private IQueryable<IndexItem> FilteredIndex(IQueryable<IndexItem> index, IEnumerable<string> filter)
{
    var filteredIndex = from i in index
                        where (from s in i.FilterNames
                               where filter.Contains(s)
                               select s).Count() == i.FilterNames.Count
                        select i;
    return filteredIndex;
}
1 голос
/ 03 апреля 2009

Как насчет чего-то вроде:

foreach(string s in filters) {
    if(s.Length == 0) continue;
    string tmp = s; // because of "capture" problem
    index = index.Where(i => i.FilterNames.Contains(tmp));
}
return index;

Это касается последовательности пунктов Where, охватывающих все фильтры - по существу, AND.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...