C# 如何使用linq返回布尔值
我有一个foreach循环,在其中我遍历一个列表,以确保每个项都是有效的,并希望返回一个布尔值 这是我的foreach代码: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
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)代码>