如果Linq函数All
对该集合返回true,是否可以编写单行查询来选择集合的某些项?我的问题来自于All()
返回一个布尔值,而不是初始列表。
我举一个简短的例子。假设我们有一个帐户列表:
class Account
{
public DateTime? CloseDate { get; set; }
public decimal? AmountOnCloseDate { get; set; }
}
是否可以使用单行查询来选择帐户(来自给定帐户列表)AmountOnCloseDate
大于某个给定值,但前提是所有帐户的CloseDate
大于src/fileA
一些给定的价值?
答案 0 :(得分:0)
我不相信这是可能的,你最接近的是if
上的All
然后是Select
:
if (accountList.All(a => a.CloseDate.Value > someValue))
{
var result = accountList.Where(a => a.AmountOnCloseDate > someOtherValue);
}
请注意,我会提醒您保留正常的if
声明,因为三元变得不那么可读。
答案 1 :(得分:0)
这是可能的,您只需将其分配到新列表,因为如果.All()
失败,它将保持为空:
List<Example> newList =
(originalList.All( r => r.A > 5 ))
?originalList.Where( r => r.B > 1 ).ToList()
: new List<Example>();
或者你可以在.All()
检查哪里, DRASTICALLY 会降低性能,但不需要三元运算符。
List<Point> newL = originalList
.Where( r => r.X > 34 && originalList.All( t => t.Y > 241 ) )
.ToList();
免责声明:一行中没有优势,只有缺点。在现实世界的场景中,我总是建议不要这样做,只是建议if。
提示: 坚持使用if
答案 2 :(得分:0)
我无法想到任何无法制作的C#声明/块/程序&#34;单行&#34; (#
指令除外)
var result = new[] { accounts }.Where(g => g.All(a => a.CloseDate > DateTime.Now))
.SelectMany(g => g).Where(a => a.AmountOnCloseDate > 42).ToList();