如果All()返回true,则单行查询以选择一些项目

时间:2017-04-20 10:04:49

标签: c# linq

如果Linq函数All对该集合返回true,是否可以编写单行查询来选择集合的某些项?我的问题来自于All()返回一个布尔值,而不是初始列表。

我举一个简短的例子。假设我们有一个帐户列表:

class Account
{
     public DateTime? CloseDate { get; set; }
     public decimal? AmountOnCloseDate { get; set; }
}

是否可以使用单行查询来选择帐户(来自给定帐户列表)AmountOnCloseDate大于某个给定值,但前提是所有帐户的CloseDate大于src/fileA 一些给定的价值?

3 个答案:

答案 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();