Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.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# 是否可以从迭代器块返回列表?_C#_Linq_Ienumerable_Yield - Fatal编程技术网

C# 是否可以从迭代器块返回列表?

C# 是否可以从迭代器块返回列表?,c#,linq,ienumerable,yield,C#,Linq,Ienumerable,Yield,我有这个功能: class Path : List<LineSegment> { } private IEnumerable<LineSegment> GetLineSegments(CollisionType collisionType, Path path) { if (collisionType == CollisionType.End) { yield return path.First(); yield retu

我有这个功能:

class Path : List<LineSegment> { }

private IEnumerable<LineSegment> GetLineSegments(CollisionType collisionType, Path path)
{
    if (collisionType == CollisionType.End)
    {
        yield return path.First();
        yield return path.Last();
    }
    else if (collisionType == CollisionType.Segment)
    {
        foreach (LineSegment lineSegment in path)
        {
            yield return lineSegment;
        }
    }
}
类路径:列表{}
私有IEnumerable GetLineSegments(碰撞类型碰撞类型路径路径)
{
if(collisionType==collisionType.End)
{
屈服返回路径。First();
屈服返回路径.Last();
}
else if(collisionType==collisionType.Segment)
{
foreach(线段路径中的线段)
{
收益返回线段;
}
}
}
基本上,我用两种方法检查碰撞(球和线之间)。在一种情况下,我只想检查绘制路径的端点,但在另一种情况下,我想返回整个路径中的每个线段

在给定的列表中循环以返回整个列表似乎有点奇怪。我能把名单还给你吗?我希望能够这样做,但我遇到了错误:

private IEnumerable<LineSegment> GetLineSegments(CollisionType collisionType, Path path)
{
    if (collisionType == CollisionType.End)
    {
        yield return path.First();
        yield return path.Last();
    }
    else if (collisionType == CollisionType.Segment)
    {
        return path.AsEnumerable<LineSegment>();
    }
}
private IEnumerable GetLineSegments(碰撞类型碰撞类型,路径路径)
{
if(collisionType==collisionType.End)
{
屈服返回路径。First();
屈服返回路径.Last();
}
else if(collisionType==collisionType.Segment)
{
返回路径:AsEnumerable();
}
}

您别无选择,只能使用
foreach
循环。这是一个经常被请求的功能,但不是该语言中的功能。

您别无选择,只能使用
foreach
循环。这是一个经常需要的功能,但不是该语言中的功能。

好的,谢谢,反正我还有其他选择<代码>IEnumerable segments=collisionType==collisionType.Segment?路径:新列表(){path.First(),path.Last()}可能更干净,所以一切都很好。@JohnSmith注意到这在语义上是不同的。因为这不是迭代器块,所以代码会被急切地执行,而不是延迟到迭代器被枚举为止。如果你不在乎,那没关系,只要意识到这两者不是同一件事。是的,这在我的情况下并不重要,但很好地指出给未来的读者。这是一个要求的功能,但这样做真的很难(几乎不可能)。当您使用“yield return”时,它从根本上改变了编译器解析和编译该方法的方式。事实上,在幕后,它基本上创建了一个实现IEnumerable的私有类,并在其中使用一些巫术对该方法进行编码,以复制该行为,就好像该函数在“收益-回报”中重新进入一样。@clevernologism这并不是不可能的。事实上,这样做相当简单。语法可能需要不同,使用
yield-foreach
是一个经常使用的建议,这将确保lexer/parser不会出现问题。至于实现,它几乎只需将其重构为此处的内容,创建一个循环并生成其中的每个项。它可能会带来一些性能优化,如果没有语言功能,这是不可能的,这也是为什么拥有它会很好的部分原因。好的,谢谢,反正我还有其他选择<代码>IEnumerable segments=collisionType==collisionType.Segment?路径:新列表(){path.First(),path.Last()}可能更干净,所以一切都很好。@JohnSmith注意到这在语义上是不同的。因为这不是迭代器块,所以代码会被急切地执行,而不是延迟到迭代器被枚举为止。如果你不在乎,那没关系,只要意识到这两者不是同一件事。是的,这在我的情况下并不重要,但很好地指出给未来的读者。这是一个要求的功能,但这样做真的很难(几乎不可能)。当您使用“yield return”时,它从根本上改变了编译器解析和编译该方法的方式。事实上,在幕后,它基本上创建了一个实现IEnumerable的私有类,并在其中使用一些巫术对该方法进行编码,以复制该行为,就好像该函数在“收益-回报”中重新进入一样。@clevernologism这并不是不可能的。事实上,这样做相当简单。语法可能需要不同,使用
yield-foreach
是一个经常使用的建议,这将确保lexer/parser不会出现问题。至于实现,它几乎只需将其重构为此处的内容,创建一个循环并生成其中的每个项。如果没有语言特性,它可能会带来一些性能优化,这在一定程度上就是它最好的原因。