C# 如何输入<;T>;工作?
of type()是如何工作的 我了解了正在发生的事情,但是LINQ提供程序如何确切地知道如何获取与指定类型匹配的所有对象。我知道C# 如何输入<;T>;工作?,c#,.net,linq,C#,.net,Linq,of type()是如何工作的 我了解了正在发生的事情,但是LINQ提供程序如何确切地知道如何获取与指定类型匹配的所有对象。我知道IQueryable“链接”请求,然后在调用GetEnumerator()时进行计算(对吗?) 具体来说,我想知道框架如何快速地进行类型比较?我在一个.NET 2.0项目中编写了一个类似这样的方法(因为2.0不支持此类功能): public IEnumerable of type() 结果:在哪里上课 { foreach(此.InnerList中的项) { TResu
IQueryable
“链接”请求,然后在调用GetEnumerator()
时进行计算(对吗?)
具体来说,我想知道框架如何快速地进行类型比较?我在一个.NET 2.0项目中编写了一个类似这样的方法(因为2.0不支持此类功能):
public IEnumerable of type()
结果:在哪里上课
{
foreach(此.InnerList中的项)
{
TResult matchItem=项目作为TResult;
if(matchItem!=null)
{
收益率匹配项;
}
}
}
这是最好的实现吗
编辑:我主要关心的是这个
of type()
的速度很快。我觉得它是一个很好的实现,但它看起来有点特定于实现(您指的是这个.InnerList)。如果您创建了一个扩展IEnumerable的扩展方法(2.0不支持吗?),那么您可以在任何可枚举集合上使用它,对吗?您当前的实现(按设计)不支持值类型
如果您想要更接近LINQ支持所有类型的of type
方法,请尝试以下方法:
public IEnumerable<TResult> OfType<TResult>(IEnumerable source)
{
foreach (object item in source)
{
if (item is TResult)
yield return (TResult)item;
}
}
public类型的IEnumerable(IEnumerable源代码)
{
foreach(源中的对象项)
{
如果(项目为TResult)
收益回报(TResult)项目;
}
}
内部列表实际上是一个“列表”。同样在工作中,我们不能使用VS2008(呃…),所以我们不能用3.5编译器将2.0作为目标。所以不,我不能使用扩展方法。所以使用is
然后强制转换会更快,还是因为包含了值类型?我认为使用as然后检查null会更快?这可能是因为特定的编译器优化导致的差异无关紧要。@TheCloudlessky:如果该方法被限制为只处理ref类型,那么我将使用as
/test for null组合,就像您已经做的那样。使用的速度差是
/cast和作为
/test for null的速度差可以忽略不计,但是如果微观优化水平对您很重要,那么我建议您进行一些基准测试。@TheCloudlessky:(如果缩短几纳秒真的很关键,那么为什么要使用迭代器生成IEnumerable
序列,而不是更快、更接近金属数据类型?)@苏里亚:因为Where
要求源序列是泛型IEnumerable
;类型的接受非泛型IEnumerable
序列。
public IEnumerable<TResult> OfType<TResult>(IEnumerable source)
{
foreach (object item in source)
{
if (item is TResult)
yield return (TResult)item;
}
}