是否有比下面更好的linq查询来查看列表是否包含另一个列表中的任何项目:

results.Where(r => r.Categories.Intersect(submittedCategories).Count() > 0)


其中,r.categories是结果所在的类别列表,而submittedCategories是用户要过滤的类别列表

最佳答案

我将使用Enumerable.Any而不是Enumerable.Count

results.Where(r => r.Categories.Intersect(submittedCategories).Any())


方法Count()对实现ICollection的源进行了优化(它仅返回collection的Count属性值)。但是Enumerable.Intersect的结果将是IEnumerable<T>,因此在这种情况下Count()将遍历所有集合:

public static int Count<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
        throw Error.ArgumentNull("source");

    ICollection<TSource> is2 = source as ICollection<TSource>;
    if (is2 != null)
        return is2.Count;

    ICollection is3 = source as ICollection;
    if (is3 != null)
        return is3.Count;

    int num = 0;
    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
    {
        while (enumerator.MoveNext()) // you will fall into this case
           num++;
    }
    return num;
}


这意味着应该从两个集合中构建完整的交集,以了解结果中的项目总数。只有这样,值才会与零进行比较。

Any()将在找到第一个项目后立即停止迭代,而不会找到所有相交的项目。

public static bool Any<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
        throw Error.ArgumentNull("source");

    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
    {
        if (enumerator.MoveNext())
            return true;
    }
    return false;
}


另一个好处-Any()可以更好地显示您的意图。

关于c# - 有没有更好的方法来搜索另一个列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23064011/

10-11 22:12
查看更多