最近我开始了一个业余爱好项目来重写集合结构,首先删除非泛型,IEnumerator并IEnumerable创建新的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) 我有一个产生返回值的方法.例如:
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)
也不起作用.
我的想法是否正确,这会自动关闭文件?
def get_file():
with open("file.csv", "rb") as f:
yield f
f = get_file()
do_stuff(f)
Run Code Online (Sandbox Code Playgroud)
如果没有,我如何编写一个返回文件对象的函数,同时确保它在接收器使用完文件后关闭该文件?
我发现了一件有趣的事情.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"在哪里?如果没有收益率返回并返回本地列表,我可以看到这些......
请解释!
我希望您考虑以下代码:
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?
yield ×6
c# ×3
python ×3
function ×2
return ×2
file ×1
for-loop ×1
foreach ×1
idisposable ×1
python-2.x ×1
python-3.x ×1