受到另一个询问失踪问题的启发 Zip功能的:
为什么课堂上没有ForEach扩展方法Enumerable?还是在任 唯一获得ForEach方法的类是List<>.有没有理由错过(表演)?
List<T>有一个调用的方法ForEach,它对每个元素执行传递的操作.
var names = new List<String>{ "Bruce", "Alfred", "Tim", "Richard" };
names.ForEach(p => { Console.WriteLine(p); });
Run Code Online (Sandbox Code Playgroud)
但是,如果names不是一个List<T>但是IList<T>,IList<T>没有像这样的方法ForEach.还有其他选择吗?
说我有一节课:
public class MyClass
{
...
}
Run Code Online (Sandbox Code Playgroud)
和一个返回的Web服务方法 IEnumerable<MyClass>
Web服务的使用者定义了一些方法:
public void DoSomething(MyClass myClass)
{
...
}
Run Code Online (Sandbox Code Playgroud)
现在,消费者可以DoSomething通过两种方式调用webservice方法的结果:
var result = // web service call
foreach(var myClass in result)
{
DoSomething(myClass);
}
Run Code Online (Sandbox Code Playgroud)
要么:
var result = // web service call
result.ToList().ForEach(DoSomething);
Run Code Online (Sandbox Code Playgroud)
毋庸置疑,我更喜欢第二种方式,因为它更短,更具表现力(一旦你习惯了我的语法).
现在,Web服务方法只公开一个IEnumerable<MyClass>,但它实际上返回一个List<MyClass>(AFAIK)意味着实际的序列化对象仍然是一个List<T>.但是,我发现(使用反射器)Linq方法ToList()制作了所有对象的副本,IEnumerable<T>而不管实际的运行时类型(在我看来,它可能只是将参数转换为a,List<T>如果它已经是一个).
这显然有一些性能开销,特别是对于大型列表(或大型对象列表).
那么我该怎么做才能克服这个问题,为什么ForEachLinq中没有方法呢?
顺便说一句,他的问题与这个问题含糊不清.
我有这个代码:
int[] g = new int[3] { 1, 2, 3 };
g.ToList().ForEach(f=>Console.Write(f));
Run Code Online (Sandbox Code Playgroud)
对于数组中的每个项目,我想执行Action....
int[]是已经实施Ienumerable.
我想执行一个没有" ToList()" 的动作
是否有任何其他溶液(用一个代码行)(使用其而无需toList?即做IEnumerable特性)
为什么 ForEach 扩展方法在 ObservableCollections 类中不可用,而在 List 中可用?