Linq所有空集合 [英] Linq All on empty collection

查看:48
本文介绍了Linq所有空集合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要检查所有定义是否都包含某些特定数据.除GroupBy返回空集合的情况外,此方法都可以正常工作.

I need to check if all definitions contains some specific data. It works fine except the case when GroupBy returns empty collection.

var exist = dbContext.Definitions
                     .Where(x => propertyTypeIds.Contains(x.PropertyTypeId) && x.CountryId == countryId)
                     .GroupBy(x => x.PropertyTypeId)
                     .All(...some condition...);

如何重写此代码,以便在空集合中所有人都将返回false?

How to rewrite this so All would return false on empty collection?

更新: 这是SQL的LINQ,我想在一次调用中执行.

UPDATE: It is a LINQ to SQL and I wanted to execute this in single call.

UPDATE2: 我认为这可行:

UPDATE2: I think this works:

var exist = dbContext.Definitions
                     .Where(x => propertyTypeIds.Contains(x.PropertyTypeId) && x.CountryId == countryId)
                     .GroupBy(x => x.PropertyTypeId)
                     .Count(x => x
                        .All(...some condition...)) == propertyTypeIds.Count;

推荐答案

如果您使用的是LINQ to Objects,我会编写自己的扩展方法.我的 Edulinq项目具有

If you're using LINQ to Objects, I'd just write my own extension method. My Edulinq project has sample code for All, and adapting that is pretty simple:

public static bool AnyAndAll<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, bool> predicate)
{
    if (source == null)
    {
        throw new ArgumentNullException(nameof(source));
    }
    if (predicate == null)
    {
        throw new ArgumentNullException(nameof(predicate));
    }

    bool any = false;
    foreach (TSource item in source)
    {
        any = true;
        if (!predicate(item))
        {
            return false;
        }
    }
    return any;
}

这避免了多次评估输入.

This avoids evaluating the input more than once.

这篇关于Linq所有空集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆