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

时间:2009-02-25 14:35:06

标签: c# .net linq extension-methods

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

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

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

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

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

3 个答案:

答案 0 :(得分: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;
}

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

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

(减少缩进以避免包装...)

或:

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

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

_fixture.Images
        .Where(image => _selectedFixtureImage.Filename && image.IsPrimary)
        .ForEach(MakeNonPrimary);

答案 1 :(得分:2)

这让我想起了“我应该使用正则表达式还是标准字符串函数”或“我应该使用XSLT / XPATH来转换XML还是使用SelectSingleNode()”。

第一个选项(即Regex / XSLT / Linq)通常被认为更加优雅和强大,任何花费一些时间学习它的人。

对于其他人而言,与第二个选项(即字符串函数,SelectSingleNode(),简单的foreach循环)相比,它似乎更不易读,也更复杂。

在过去,我被指责在我的设计中使用Regex和XSLT / XPATH过度复杂化。

就在最近,我被指责为“害怕改变”,因为在Linq Where,Foreach等许多情况下,更喜欢简单的foreach(甚至是for)循环。

我很快意识到,在这两种情况下,人们都认为这种情况是那种认为有“一种方式”去做所有事情的人。

虽然我总是发现根据其优点考虑每种情况并为工作选择合适的工具会更聪明。我只是忽略它们并继续我的方法;)

对于你描述的那种情况,第一种选择比我更好。但是如果我的团队在Linq都能胜任,我可能会使用Linq方法,并且我们有编码指南以避免大单行(通过将它们拆分)

答案 2 :(得分:1)

任何降低垂直或水平复杂性的东西对我来说都是一个优势。此外,Linq更能描述您想要实现的目标。