标签: yield

yield无法使用自定义枚举/枚举器

最近我开始了一个业余爱好项目来重写集合结构,首先删除非泛型,IEnumeratorIEnumerable创建新的IEnumerator/IEnumerable基接口.当我在新的可枚举界面和正常界面之间创建转换时,我很快就遇到了产量问题.

IEnumerable<T>IEnumerator<T>正常的一样,除了它们不从非通用的继承.为什么不能使用我的接口?foreach可以使用我的界面.

例:

public static System.Collections.Generic.IEnumerable<T> ToMSEnumerable(this My.IEnumerable<T> enumerable)
{
    foreach (var item in enumerable) // enumerating my enumerable works
    {
        yield return item; // this works
    }
}

public static My.IEnumerable<T> ToMyEnumerable(this System.Collections.Generic.IEnumerable<T> enumerable)
{
    foreach (var item in enumerable) // obviously work
    {
        yield return item; // this is where its not working.
                           // I haven't touched this in a few day, so I don't remember
                           // the …
Run Code Online (Sandbox Code Playgroud)

c# yield

-1
推荐指数
1
解决办法
92
查看次数

IEnumerable for vs foreach

我有一个产生返回值的方法.例如:

public static IEnumerable<int> GetValues()
{
    for (int i = 0; i < 10; i++)
    {
        yield return i;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我用foreach调用这个方法时,yield return i;被调用了10次

foreach (int i in GetValues())
{
    Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)

当我用for循环调用它时,yield return i;被称为阶乘10次

for (int i = 0;i< 10;i++)
{
    Console.WriteLine(GetValues().ElementAt(i));
}
Run Code Online (Sandbox Code Playgroud)

问题:有没有办法保持for-loop并避免那些多次调用ElementAt(i)?或者......我可以通过其索引从IEnumerable中调用一个元素,而不会导致其先前元素的迭代吗?我发现的唯一的事情就是这个,但是

for (int i = 0; i < 10; i++)
{
    Console.WriteLine(GetValues().Skip(i).First());
}
Run Code Online (Sandbox Code Playgroud)

也不起作用.

c# foreach for-loop yield

-1
推荐指数
2
解决办法
2900
查看次数

python3中自动关闭文件?

我的想法是否正确,这会自动关闭文件?

def get_file():
    with open("file.csv", "rb") as f:
        yield f

f = get_file()
do_stuff(f)
Run Code Online (Sandbox Code Playgroud)

如果没有,我如何编写一个返回文件对象的函数,同时确保它在接收器使用完文件后关闭该文件?

python yield file with-statement python-3.x

-1
推荐指数
1
解决办法
1669
查看次数

使用IDisposable实例的yield返回IEnumerable <T>

我发现了一件有趣的事情.c#,.NET 4.0.我有一个代表IDisposable接口的类.在上面提到的类中我有一个函数,返回IEnumerable并返回yield.在调用时,controll跳过该函数.请勿介入.示例:

class Program
{
    static void Main(string[] args)
    {
        using (DispClass d = new DispClass())
        {
            d.Get2();
            d.Get1();
        }
    }

}

public class DispClass: IDisposable
{
    public DispClass()
    {
        Console.WriteLine("Constructor");
    }
    public void Dispose()
    {
        Console.WriteLine("Dispose");
    }
    public int Get1()
    {
        Console.WriteLine("Getting one");
        return 1;
    }
    public IEnumerable<int> Get2()
    {
        Console.WriteLine("Getting 1");
        yield return 1;
        Console.WriteLine("Getting 2");
        yield return 2;
    }

}
Run Code Online (Sandbox Code Playgroud)

输出:"构造函数""获取一个""处理"

"获得1","获得2"在哪里?如果没有收益率返回并返回本地列表,我可以看到这些......

请解释!

c# yield idisposable

-2
推荐指数
1
解决办法
163
查看次数

为什么我不能在收益率上使用yield?

我希望您考虑以下代码:

def func(alist):
    if len(alist) == 1:
        return arg * 2
    for item in alist:
        yield item * 2
Run Code Online (Sandbox Code Playgroud)

运行它时,出现以下错误:

SyntaxError: 'return' with argument inside generator
Run Code Online (Sandbox Code Playgroud)

现在,我意识到我无法做到这一点。但是,我想知道为什么。到底是什么导致Python抛出SyntaxError

python yield return function python-2.x

-3
推荐指数
1
解决办法
1375
查看次数

在某些情况下,收益率比回报慢?

我正在尝试学习收益率与回报的用例。在这里,我正在清理一本字典。但这里的返回速度似乎更快。是否只有当我们不需要运行 0 到 imax 的所有迭代时,yield 才会更快?

在此输入图像描述

python yield return function

-4
推荐指数
1
解决办法
427
查看次数