如果IgnoreNullItems在下面的sammple代码中调用扩展方法,则延迟执行按预期工作,但是在使用时IgnoreNullItemsHavingDifferentBehaviour会立即引发异常.为什么?
List<string> testList = null;
testList.IgnoreNullItems(); //nothing happens as expected
testList.IgnoreNullItems().FirstOrDefault();
//raises ArgumentNullException as expected
testList.IgnoreNullItemsHavingDifferentBehaviour();
//raises ArgumentNullException immediately. not expected behaviour ->
// why is deferred execution not working here?
Run Code Online (Sandbox Code Playgroud)
感谢您分享您的想法!
Raffael Zaghet
public static class EnumerableOfTExtension
{
public static IEnumerable<T> IgnoreNullItems<T>(this IEnumerable<T> source)
where T: class
{
if (source == null) throw new ArgumentNullException("source");
foreach (var item in source)
{
if (item != null)
{
yield return item;
}
}
yield break;
}
public …Run Code Online (Sandbox Code Playgroud) 在生成器函数中,如何确定它是否已经产生了什么?
def my_generator(stuff):
# complex logic that interprets stuff and may or may not yield anything
# I only want to yield this if nothing has been yielded yet.
yield 'Nothing could be done with the input.'
Run Code Online (Sandbox Code Playgroud) 这个yield return概念的官方名称究竟是什么?
public IEnumerable<T> Bar() {
...
yield return foo;
...
}
Run Code Online (Sandbox Code Playgroud)
我听说(读)它被称为:
迭代器不只是迭代某些东西的"东西"吗?A List<T> 是一个IEnumerable<T>,所以似乎也不合理.
这里有很多答案,谈论yield return使用这两个术语中的一个.
那么"发电机"怎么样?或者这只适用于你"凭空捏造价值",例如你不需要数据收集作为来源的Fibonacci数字?
我有一个thunk名为logInline(改编自Co文档).
我注意到thunkified get总是似乎是yield一个数组.这是设计的吗?它是这样thunkify做的,还是标准的一部分yield?
var co = require('co'),
get = thunkify(request.get);
var logInline = co(function *(){
var google = yield get('http://google.com');
console.log(google[0].statusCode);
})
logInline()
Run Code Online (Sandbox Code Playgroud)
请注意,此处的变量'google'始终是一个数组.为什么?请注意,request.get通常返回err, response(即没有数组).
脚本BTW返回200google.com返回的任何其他响应代码.
唉产量文件是相当稀疏ATM.
编辑: Thunk并不总是返回数组.例如,如果var readFile = thunkify(fs.readFile);:
var fileContents = yield readFile('myfile', 'utf8');
log(fileContents);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,fileContents不会在数组中返回.那么为什么谷歌在一个阵列里? 在thunkify中似乎有一些东西可以控制thunk返回的内容
我有一些非常大的文本文件(> 2g),我想逐字处理.这些文件是以空格分隔的文本文件,没有换行符(所有单词都在一行中).我想取每个单词,测试它是否是字典单词(使用附魔),如果是,则将其写入新文件.
这是我现在的代码:
with open('big_file_of_words', 'r') as in_file:
with open('output_file', 'w') as out_file:
words = in_file.read().split(' ')
for word in word:
if d.check(word) == True:
out_file.write("%s " % word)
Run Code Online (Sandbox Code Playgroud)
我查看了在python中读取大文件的懒惰方法,建议使用yield读取块,但我担心使用预定大小的块将在中间分割单词.基本上,我希望块只接近指定的大小,而只在空格上分割.有什么建议?
在下面的scala for循环中
private val tpath = for (csvPath <- CsvPaths
if new java.io.File(csvPath).exists()
) yield csvPath
Run Code Online (Sandbox Code Playgroud)
我想添加一个println副作用 - 类似于以下内容:
private val tpath = for (csvPath <- CsvPaths
if new java.io.File(csvPath).exists() { // Following is illegal syntax
println(s"Following path exists $csvPath")
}
) yield csvPath
Run Code Online (Sandbox Code Playgroud)
那么是否有任何语法可以将副作用添加到for/yield循环中?
我有两个功能(发电机).
def a():
yield 1
yield 2
def b():
yield 'A'
yield 'B'
yield a()
Run Code Online (Sandbox Code Playgroud)
现在我想迭代b()并期望它应该输出A B 1 2.但不是.它给了这个.
In [11]: for i in b():
....: print i
....:
A
B
<generator object a at 0x10fc3ddc0>
Run Code Online (Sandbox Code Playgroud)
如何获得所需的输出?
我试图创建一个递归函数来返回一个控件的所有后代IEnmerable(Of Control).我创建了一个返回IEnumerable(Of Control)并使用的函数Yield:
Public Function GetControls(C As Control) As IEnumerable(Of Control)
For Each Child As Control In C.Controls
Yield Child
For Each GrandChild In GetControls(Child)
Yield GrandChild
Next
Next
End Function
Run Code Online (Sandbox Code Playgroud)
但我有一个编译时错误:
错误BC30800,方法参数必须括在括号中.
我尝试使用它像函数Yield(Child)或Yield Return Child或Return Yield Child但仍然有错误.
通过在google或bing中搜索错误消息,我找不到任何与此问题相关的内容.我该如何解决这个问题?
问题
当我尝试在async方法中调用我的“ normal”方法时,它将从Debugger 1中被忽略。
这是我的异步方法
internal async static Task<DefinitionsModel> DeserializeAsync(this string path)
{
var model = new DefinitionsModel();
var content = await File.ReadAllTextAsync(path);
model.Pages = content.GetPages();
return model;
}
Run Code Online (Sandbox Code Playgroud)
这是我的“正常”方法
private static IEnumerable<PageModel> GetPages(this string content)
{
var level = 0;
var value = nameof(PageModel.Page).GetDElement<PageModel>();
var start_with_line = $"{level} {value} ";
var end_with_line = string.Concat(Enumerable.Repeat(Environment.NewLine, 2));
var expression = $@"\b{start_with_line}\S * {end_with_line}\b";
var matches = content.GetPagesFromContent(expression);
yield return new PageModel();
}
Run Code Online (Sandbox Code Playgroud)
帮助图片
yield ×10
c# ×3
python ×3
.net ×2
generator ×2
ienumerable ×2
block ×1
co ×1
io ×1
javascript ×1
keyword ×1
large-files ×1
node.js ×1
ruby ×1
scala ×1
terminology ×1
thunk ×1
vb.net ×1