使用LINQ替换循环是明智的吗?

Jas*_*ung 8 .net c# linq extension-methods

既然LINQ已经拥有了巨大的功能,我想知道哪种语法更可取.例如,我发现了以下方法(只是认为这是一个很好的例子):

foreach (FixtureImageServicesData image in _fixture.Images)
{
    if (image.Filename != _selectedFixtureImage.Filename && image.IsPrimary)
    {
        image.IsPrimary = false;
        image.IsChanged = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我们将它转​​换为LINQ方法,它看起来像这样(未经测试):

_fixture.Images.Where(x => x.Filename != _selectedFixtureImage.Filename && x.IsPrimary).ForEach(x => { x.IsPrimary = false; x.IsChanged = true; });
Run Code Online (Sandbox Code Playgroud)

您更愿意看到和维护哪一个?这是疯狂还是天才?

Jon*_*eet 22

使用ForEach扩展方法是可以的,但有一个中间方法:

// Rename 'query' to something meaningful :)
var query = _fixture.Images
                    .Where(image => _selectedFixtureImage.Filename 
                                    && image.IsPrimary);

foreach (FixtureImageServicesData image in query)
{
    image.IsPrimary = false;
    image.IsChanged = true;
}
Run Code Online (Sandbox Code Playgroud)

如果你确实使用了一种ForEach方法,我肯定会用多行格式化它:

_fixture.Images
    .Where(image => _selectedFixtureImage.Filename && image.IsPrimary)
    .ForEach(image => { image.IsPrimary = false; image.IsChanged = true;});
Run Code Online (Sandbox Code Playgroud)

(减少压痕以避免包装......)

要么:

_fixture.Images
        .Where(image => _selectedFixtureImage.Filename && image.IsPrimary)
        .ForEach(image => { image.IsPrimary = false; 
                            image.IsChanged = true; });
Run Code Online (Sandbox Code Playgroud)

您甚至可能希望将"制作非主要"位提取到单独的方法中,此时您将拥有:

_fixture.Images
        .Where(image => _selectedFixtureImage.Filename && image.IsPrimary)
        .ForEach(MakeNonPrimary);
Run Code Online (Sandbox Code Playgroud)