相当于无数的<t>无损失

dev*_*hog 0 c# linq

我有一个方法只接受ienumerable<t>参数,但我的本地值是一个简单的可数字.

我无法改变这些条件.

现在我的问题是如何在ienumerable<t>不丢失项目的对象引用的情况下获得可数据?我不想复制数据或其他任何东西.

请问ienumerable.Cast<object>()做的工作?我不希望新的参考项目,我只想ienumerable<t>尽可能快地从可数字.

Man*_*ert 6

Linq-Statement只是一组规则,当有人从IEnumerable请求linq语句生成的项时执行这些规则.foreach就是这样一个消费者,但IEnumerable的任何其他消费者在获取物品之前都会启动相同的规则,所以你总能想象用foreach作为类比.

foreach(object item in myEnumerable)
{
    ((MyClass)item).DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

在概念上与以下相同:

foreach(MyClass item in myEnumerable.Cast<MyClass>())
{
    item.DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

所以不,没有复制.但是,如果您尝试转换错误类型的项目,则应该抛出错误.如果你想要更多这样的内容:

foreach(object item in myEnumerable)
{
    MyClass myItem = item as MyClass;
    if(myItem != null)
        myItem.DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

那么你会使用OfType():

foreach(MyClass item in myEnumerable.OfType<MyClass>())
{
    item.DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您在可枚举项上调用ToList或ToArray,它将由您自己进行评估(同样的事情就像您调用foreach一样),并且它将保存到新的集合中.如果您的原始IEnumerable包含值类型(如int,float,structs等)而不是引用类型(如您自己的任何类),那么您实际上将拥有新数组中项目的副本.因此,如果您确实想要尽早评估linq查询,请仅使用这些方法.