繁体   English   中英

如何使用linq返回布尔值

[英]How to use linq to return a boolean

我有一个foreach循环,在其中循环访问列表以确保每个项目都是有效的并想返回一个布尔值。

这是我的foreach代码:

bool isValid = true;

foreach (var req in requestList)
{
    if (!req.ChannelId.HasValue || !req.PayoutAmountInCents.HasValue)
    {
        isValid = false;
        PayoutFDEvents.LogInvalidPayoutRequest(this.BuildPayoutFDDocument(req), "missing channelId or patronage amount");
    }
}   

这是我尝试将其转换为linq语句:

var isValid = requestList
    .Select(r =>
    {
        if (!r.ChannelId.HasValue || !r.PayoutAmountInCents.HasValue)
        {
            PayoutFDEvents.LogInvalidPayoutRequest(this.BuildPayoutFDDocument(r), "missing channelId or patronage amount");
            return false;
        }
        return true;
    });

但是,看起来我的实现改为返回布尔列表。 有什么办法可以退还全部布尔值吗?

可以将其转换为一个简单的表达式,如下所示:

var isValid = requestList.All(r => r.ChannelId.HasValue && r.PayoutAmountInCents.HasValue)

我建议您不要在表达式中间记录一些内容-这只是臭味,一旦转换为使用All() ,效果将不佳

一种选择是使用:

var isValid = requestList
          .Select(r => 
          {
              var valid =r.ChannelId.HasValue && r.PayoutAmountInCents.HasValue;
              if (!valid)
              {
                  PayoutFDEvents.LogInvalidPayoutRequest(
                      this.BuildPayoutFDDocument(req), "missing channelId or patronage amount");
              }
              return valid;
          })
          .DefaultIfEmpty(true)
          .Min();

因为false “小于” true ,所以如果任何单个条目满足条件(即null ),它将返回false

DefaultIfEmpty位用于处理requestList为空的情况-在这种情况下, isValid将设置为true

不过,老实说,由于您是在现有循环中执行日志记录,因此我会保留现有代码。 它简单,清晰,易于阅读和理解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM