相关疑难解决方法(0)

为什么IQueryable.All()在空集合上返回true?

所以我遇到了今天的情况,其中一些生产代码正在失败,因为一个方法完全按照MSDN中的说明执行.因为没有阅读文档而感到羞耻.然而,我仍然在摸索为什么它会以这种方式行事,即使是"按设计",因为这种行为正好与我预期的(和其他已知行为)相反,因此似乎违反了原则最不惊讶的.

All()方法允许您提供谓词(例如lambda表达式)来测试IQueryable,返回一个布尔值,指示所有集合成员是否与测试匹配.到现在为止还挺好.这就是它变得奇怪的地方. 如果集合为空,All()也会返回true.由于以下原因,这似乎完全落后于我:

  • 如果集合为空,那么这样的测试充其量是未定义的.如果我的车道是空的,我不能断言停在那里的所有车都是红色的.有了这种行为,在空车道上停放的所有车辆都是红色和蓝色和棋盘 - 所有这些表达式都将返回true.
  • 对于熟悉SQL概念的人来说,NULL!= NULL,这是意外的行为.
  • Any()方法按预期行为,并且(正确)返回false,因为它没有任何与谓词匹配的成员.

所以我的问题是,为什么All()这样做?它解决了什么问题?这是否违反了最不惊讶的原则?

我将此问题标记为.NET 3.5,但该行为也适用于.NET 4.0.

编辑 好的,所以我掌握了这个逻辑方面,正如杰森和你们其他人所做的那样.不可否认,空集合是一种边缘情况.我想我的问题根植于斗争,只是因为某些东西是合乎逻辑的并不意味着如果你没有处于正确的思维框架中,它必然是有道理的.

.net linq logic

48
推荐指数
4
解决办法
5218
查看次数

Linq All on empty collection

我需要检查所有定义是否包含一些特定数据.除了GroupBy返回空集合的情况外,它工作正常.

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

如何重写这样所有All将在空集合上返回false?

更新:这是一个LINQ to SQL,我想在单个调用中执行它.

更新2:我认为这有效:

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;
Run Code Online (Sandbox Code Playgroud)

.net c# linq entity-framework

15
推荐指数
4
解决办法
1339
查看次数

为什么这种情况会回归真实

可能重复:
为什么Enumerable.All为空序列返回true?

码:

var line = "name:";
Console.Write(line.Split(new char[] { ':' })[1].All(char.IsDigit)); 
Run Code Online (Sandbox Code Playgroud)

怎么可能?它不应该返回虚假?after :是一个空字符串.

.net c# string

6
推荐指数
3
解决办法
405
查看次数

如何检查列表中的所有元素是否对使用Linq的属性返回true?

我想有一个LINQ语句调用属性IsValid.
如果所有元素都返回true,我希望语句也返回true.
怎么做到呢?

c# linq

5
推荐指数
3
解决办法
5370
查看次数

如果集合为空,LINQ Enumerable.All 始终返回 True

    class Program
    {
        static void Main()
        {
            var list = new List<Foo>();
            var a = list.All(l => l.BoolBar == true);//true
            var s = list.All(l => l.Bar.Contains("magicstring"));//true
        }
    }
    public class Foo
    {
        public bool BoolBar{ get; set; }
        public string Bar{ get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

基于这个片段,我想知道为什么 Linq 框架创建者选择使用这个解决方案来处理空集合?另外,由于 Visual Studio 和 Linq 都是 MS 产品,为什么如果用户在执行 .All 之前没有检查集合是否为空,智能感知不会发出警告?我认为它可以带来很多意想不到的结果。

.net c# linq

2
推荐指数
1
解决办法
1448
查看次数

Linq.对于空集合,所有都返回true

请考虑以下代码:

static void Main(string[] args)
{
    List<string> items = new List<string>();
    string result = null;

    if(items.All(o => o == "ABC"))
    {
        result = "All";
    }
    else if(items.Any(o => o == "XYZ"))
    {
        result = "Any";
    }

    Console.WriteLine(result);
    Console.Read();
}
Run Code Online (Sandbox Code Playgroud)

这将打印"全部".

为什么列表满足"全部"条件o == "ABC"

c# linq

-1
推荐指数
2
解决办法
937
查看次数

标签 统计

c# ×5

linq ×5

.net ×4

entity-framework ×1

logic ×1

string ×1