繁体   English   中英

对每个使用where / lambda和之间的区别

[英]Difference between using where/lambda and for each

我是C#的新手,遇到了在字典上执行的此功能。

 _objDictionary.Keys.Where(a => (a is fooObject)).ToList().ForEach(a => ((fooObject)a).LaunchMissles());

我的理解是,这实际上是将作为fooObject的每个键放入列表中,然后执行每个键的LaunchMissles函数。 与像这样对每个循环使用a有何不同?

foreach(var entry in _objDictionary.Keys)
{
    if (entry is fooObject)
    {
        entry.LaunchMissles();
    }
}

编辑:强烈的意见似乎是没有功能上的差异。

这是滥用LINQ的一个很好的例子-语句没有以其他任何方式变得更具可读性或更好,但是有些人只是喜欢将LINQ放在各处。 尽管在这种情况下,您可以通过以下两种方式从两个方面中取最大优势:

foreach(var entry in _objDictionary.Keys.OfType<FooObject>())
{
    entry.LaunchMissles();    
}

请注意,在您的foreach示例中,缺少对FooObject以调用LaunchMissles

通常,Linq不是Voodomagic,如果不使用它,则会做与需要编写的内容相同的事情。 Linq只是使事情变得更容易编写,但不会击败常规的代码性能(如果确实如此)

就您而言,您的“老式”方法非常好,我认为这是有利的

foreach(var entry in _objDictionary.Keys)
{
    fooObject foo = entry as fooObject;
    if (foo != null)
    {
        foo .LaunchMissles();
    }
}

关于Linq方法:

将序列实例化为列表只是为了对其调用方法,与上面的代码相同,只是浪费资源并使可读性降低。

在您的示例中,它并没有什么区别,但是如果源不是Collection(例如Dictionary.Keys是),而是真正以惰性方式工作的IEnumerable,则可能会产生巨大的影响。

惰性评估旨在在需要时产生项目,在实际执行ForEach之前,在两者之间调用ToList将首先收集所有项目。 普通的foreach方法将获得一项,然后对其进行处理,然后获得下一项,依此类推。

如果您真的想使用“ Linq-Foreach”而不是使用List-Implementation,而是使用自己的扩展方法(如问题下方的注释中所述)

public static class EnumerableExtensionMethods
{ 
    public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action)
    {
        foreach(T item in sequence) 
            action(item);
    }
}

然后仍然应该使用常规的foreach滚动,除非您将foreach-body放入其他方法中

sequence.ForEach(_methodThatDoesThejob);

这是使用此方法的唯一“对我来说可接受的”方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM