[英]Why is there a difference between using a lambda in a where extension method an using a func in a where extension method
[英]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.