【问题标题】:Is it wise to use LINQ to replace loops?使用 LINQ 替换循环是否明智?
【发布时间】:2009-02-25 14:35:05
【问题描述】:

现在我们有了 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; });

您更希望看到和维护哪个?这是疯子还是天才?

【问题讨论】:

    标签: c# .net linq extension-methods


    【解决方案1】:

    使用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);
    

    【讨论】:

    • 我认为您的多行示例不应在 Where 语句后加分号。
    【解决方案2】:

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

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

    虽然对于其他所有人来说,与第二个选项(即字符串函数、SelectSingleNode()、简单的 foreach 循环)相比,它的可读性更低且更复杂。

    过去,有人指责我在设计中使用 Regex 和 XSLT/XPATH 使事情变得过于复杂。

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

    我很快意识到,在这两种情况下,说这话的人都是那种认为有“一种方法”可以做任何事情的人。

    而我一直发现,根据每种情况的优点来考虑并为工作选择合适的工具会更明智。我只是忽略它们并继续我的方法;)

    对于您描述的那种情况,第一个选项对我来说更可取。但是,如果我的团队都能够胜任 Linq,我可能会使用 Linq 方法,并且我们有编码指南来避免大的单行代码(通过将它们拆分)

    【讨论】:

      【解决方案3】:

      任何降低垂直或水平复杂性的东西对我来说都是一个加分项。此外,Linq 更能描述您想要完成的任务。

      【讨论】:

        猜你喜欢
        • 2011-07-16
        • 1970-01-01
        • 2013-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多