Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用linq返回布尔值_C#_Linq - Fatal编程技术网

C# 如何使用linq返回布尔值

C# 如何使用linq返回布尔值,c#,linq,C#,Linq,我有一个foreach循环,在其中我遍历一个列表,以确保每个项都是有效的,并希望返回一个布尔值 这是我的foreach代码: bool isValid = true; foreach (var req in requestList) { if (!req.ChannelId.HasValue || !req.PayoutAmountInCents.HasValue) { isValid = false; PayoutFDEvents.LogInv

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

然而,我的实现似乎返回了bool列表。有没有一种方法可以返回一个整体布尔值?

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

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

<>我建议你不要在你的表达式中间记录一些东西——这只是臭味,一旦转换为使用<代码>(),

>/p> 这就可以转换成一个简单的表达式:

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

<>我建议你不要在你的表达式中间记录一些东西——这只是一种臭味,一旦转换成使用<代码>()/<代码>

< p> >一个选项是:

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


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

一个选项是使用:

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

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

您也可以尝试以下方法:

var invalids = requestList.Where(r => !(r.ChannelId.HasValue && r.PayoutAmountInCents.HasValue)).ToList();
invalids.ForEach(r => PayoutFDEvents.LogInvalidPayoutRequest(BuildPayoutFDDocument(r), "msg"));
bool isValid = invalids.Any();
我认为您的逻辑太复杂,无法在一行语句中完成。

您也可以尝试以下方法:

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

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

LINQ在这里不合适,因为调用了
PayoutFDEvents.LogInvalidPayoutRequest
。这是一个副作用,不是投影逻辑的一部分。坚持使用原始的
foreach
循环。我想记录所有无效项ID其中一个答案对您有效?由于
PayoutFDEvents.LogInvalidPayoutRequest
调用,LINQ在这里不合适。这是一个副作用,不是投影逻辑的一部分。请继续使用原始的
foreach
循环。我想记录所有无效项。如果两个答案中的任何一个对您有效?为了更好地理解,不记录我的表达式的原因是什么?@RDoolabh这是关注点分离。您可以使用单独的语句检测并记录有问题的条目:
requestList.Where(r=>r.ChannelId==null | | r.PayoutAmountInCents==null)
为了更好地理解,不登录我的表达式的原因是什么?@RDoolabh这是关注点分离。您可以使用单独的语句检测并记录有问题的条目:
requestList.Where(r=>r.ChannelId==null | | r.PayoutAmountInCents==null)