我有一个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;
});
但是,看来我的实现返回了布尔列表。有什么方法可以退还全部布尔值吗?
答案 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>
坦白地说,由于您是在现有循环中执行日志记录,因此我会保留现有代码。它简单,清晰,易于阅读和理解。