【问题标题】:How to use linq to return a boolean如何使用 linq 返回布尔值
【发布时间】:2019-10-02 10:05:24
【问题描述】:

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

但是,看起来我的实现返回了一个布尔列表。有没有办法可以返回一个整体的布尔值?

【问题讨论】:

  • LINQ 在这里不合适,因为 PayoutFDEvents.LogInvalidPayoutRequest 调用。这是一个副作用,而不是投影逻辑的一部分。坚持原来的 foreach 循环。
  • 我想记录所有无效项目
  • 这两个答案对你有用吗?

标签: c# linq


【解决方案1】:

这可以转换成这样的简单表达式:

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

我建议你不要在你的表情中间记录一些东西 - 这只是很臭,一旦你转换为使用 All() 就不会很好用

【讨论】:

  • 为了更好的理解,我的表情不登录是什么原因?
  • @RDolabh 这是关注点分离。您可以使用单独的语句检测并记录有问题的条目:requestList.Where(r => r.ChannelId == null || r.PayoutAmountInCents == null).ForEach(r => PayoutFDEvents.LogInvalidPayoutRequest(this.BuildPayoutFDDocument(r), "missing channelId or patronage amount"));
【解决方案2】:

你也可以试试这个:

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

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

【讨论】:

    【解决方案3】:

    一种选择是使用:

    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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多