从另一个集合的内容过滤项目集合

时间:2009-04-02 22:54:23

标签: c# linq sorting collections

这曾经为我工作然后失败了。我想只返回包含所有过滤器的项目,而不是至少一个现在正在执行的过滤器。这里有什么不对?

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 个答案:

答案 0 :(得分:3)

直接向前。对于索引检查中的给定项目,对于给定项目包含过滤器的所有过滤器都是如此。只需选择索引中的所有项目,即给定条件为真。

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 :(得分:1)

如下:

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

答案 2 :(得分:1)

转过身来。你想要的是索引中的那些项目,其中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;
}