如何使用linq返回布尔值

时间:2019-09-17 21:48:51

标签: c# linq

我有一个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;
    });

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

3 个答案:

答案 0 :(得分:2)

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

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

我建议您不要在表达式的中间记录一些东西-这太臭了,一旦您转换为使用All()

,效果就不会很好

答案 1 :(得分:1)

您也可以尝试以下方法:

var invalids = requestList.Where(r => !(r.ChannelId.HasValue && r.PayoutAmountInCents.HasValue)).ToList();
invalids.ForEach(r => PayoutFDEvents.LogInvalidPayoutRequest(BuildPayoutFDDocument(r), "msg"));
bool isValid = invalids.Any();

我认为您的逻辑太复杂,无法在一行语句中完成。

答案 2 :(得分:-1)

一种选择是使用:

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,如果任何单个条目满足条件(即false),它将返回null

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

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