Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何输入<;T>;工作?_C#_.net_Linq - Fatal编程技术网

C# 如何输入<;T>;工作?

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

of type()是如何工作的

我了解了正在发生的事情,但是LINQ提供程序如何确切地知道如何获取与指定类型匹配的所有对象。我知道
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;
    }
}