所以我遇到了今天的情况,其中一些生产代码正在失败,因为一个方法完全按照MSDN中的说明执行.因为没有阅读文档而感到羞耻.然而,我仍然在摸索为什么它会以这种方式行事,即使是"按设计",因为这种行为正好与我预期的(和其他已知行为)相反,因此似乎违反了原则最不惊讶的.
该All()方法允许您提供谓词(例如lambda表达式)来测试IQueryable,返回一个布尔值,指示所有集合成员是否与测试匹配.到现在为止还挺好.这就是它变得奇怪的地方. 如果集合为空,All()也会返回true.由于以下原因,这似乎完全落后于我:
Any()方法按预期行为,并且(正确)返回false,因为它没有任何与谓词匹配的成员.所以我的问题是,为什么All()这样做?它解决了什么问题?这是否违反了最不惊讶的原则?
我将此问题标记为.NET 3.5,但该行为也适用于.NET 4.0.
编辑 好的,所以我掌握了这个逻辑方面,正如杰森和你们其他人所做的那样.不可否认,空集合是一种边缘情况.我想我的问题根植于斗争,只是因为某些东西是合乎逻辑的并不意味着如果你没有处于正确的思维框架中,它必然是有道理的.
我需要检查所有定义是否包含一些特定数据.除了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) 码:
var line = "name:";
Console.Write(line.Split(new char[] { ':' })[1].All(char.IsDigit));
Run Code Online (Sandbox Code Playgroud)
怎么可能?它不应该返回虚假?after :是一个空字符串.
我想有一个LINQ语句调用属性IsValid.
如果所有元素都返回true,我希望语句也返回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 之前没有检查集合是否为空,智能感知不会发出警告?我认为它可以带来很多意想不到的结果。
请考虑以下代码:
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"