重构对LINQ的foreach语句

时间:2014-02-27 20:31:27

标签: c# linq

我一直致力于一个项目,我实际上正在重构一些代码。我遇到过很多foreach和if语句,可以很容易地用LINQ代替。

但是我有这个代码片段,我想知道如何让它更具功能性。

foreach (var notification in notifications)
{
    if (_emailService.SendEmail(notification.Message.Subject, notification.Message.Body, notification.Message.MailTo))
    {
        successNotificationIDs.AddRange(notification.ID);
    }
    else
    {
        errorCount++;
    }
}

EmailService的SendEmail方法返回一个bool。如果其执行成功,它将向已声明的集合添加IEnumerable Int(successNotificationsIDs)。如果没有,我将增加errorCount变量。

1 个答案:

答案 0 :(得分:2)

要将序列的项目分成所有传递某些谓词的项目和未传递某些谓词的项目,您可以使用ToLookup。使用谓词作为选择器:

var lookup =  notifications.ToLookup(notification =>
    _emailService.SendEmail(notification.Message.Subject, 
        notification.Message.Body,
        notification.Message.MailTo));

var successfulIDs = lookup[true].SelectMany(notification => notification.ID);
var errorCount = lookup[false].Count();