C# 提供意外输出的可枚举
实际产量:C# 提供意外输出的可枚举,c#,ienumerable,enumerable,C#,Ienumerable,Enumerable,实际产量: 10 11 12 13 14 15 16 17 18 19 20 这个代码有什么问题?发生了什么?的第二个参数指定要生成的整数数,而不是范围中的最后一个整数 如果需要,可以很容易地构建自己的方法,或者更新现有的Foo.Range方法,从start和end参数生成范围。的第二个参数是要生成的项目数 为什么不是结束而是计数 如果有起点和终点,如何枚举空范围?例如,假设屏幕上有一个文本缓冲区和一个选择,并且该选择是一个字符,从字符12开始,到字符12结束。你如何列举这
10 11 12 13 14 15 16 17 18 19 20
这个代码有什么问题?发生了什么?的第二个参数指定要生成的整数数,而不是范围中的最后一个整数
如果需要,可以很容易地构建自己的方法,或者更新现有的Foo.Range
方法,从start
和end
参数生成范围。的第二个参数是要生成的项目数
为什么不是结束而是计数
如果有起点和终点,如何枚举空范围?例如,假设屏幕上有一个文本缓冲区和一个选择,并且该选择是一个字符,从字符12开始,到字符12结束。你如何列举这个范围?从字符12开始枚举一个字符
现在假设选择为零个字符。你如何列举它?如果你有开始,大小,你只需通过零的大小。如果你有开始,结束,你会怎么做?你不能通过12级和12级
现在你可能会说“好吧,如果它是一个空范围,就不要枚举它”。所以你最终得到的代码应该是这样的:
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
而不是写作
var results = from index in Range(selectionStart, selectionSize)
where blah blah blah
select blah;
IEnumerable results=null;
如果(selectionSize==0)
{
结果=可枚举的.Empty();
}
其他的
{
结果=来自范围内的索引(selectionStart、selectionEnd)
什么地方
选择废话;
}
这伤了我的眼睛。别忘了这是关于Enumerable而不是int的,因为很多(大多数?)Enumerable的“范围内的最后一项”没有多大意义。@Finnk:Enumerable.range的输出总是一个
IEnumerable
。如果count
参数为零,则序列将为空,否则它将包含顺序整数。为什么不是end
而是count
?自由民主党有什么具体的设计目标吗?你可以让结束是独占的,开始是包含的,比如count==end-start,这允许你优雅地表示空范围。(Dijkstra同意,见EWD831)。但我很高兴事情是这样的,所以我不必记住关于包含或排除索引的细节。Joren:好的,那么如何表示以Int32.MaxValue结尾的范围?如果“end”必须比序列中的最后一个值大一个,那么您有一些选择。(1) 不要让该值成为序列中的最后一个值,(2)仅在这种情况下,将端点设为long而不是int。这两个看起来都是糟糕的设计。但您仍然有一个相关的问题:例如,您的范围不能从-1扩展到Int32.MaxValue,因为长度会溢出。使用Joren的方法,您实际上可以支持比当前方法更多的范围。@kvb:做得很好;我想知道是否有人会注意到我论点中的缺陷!:-)简言之,这两种方法都有利弊。
var results = from index in Range(selectionStart, selectionSize)
where blah blah blah
select blah;
IEnumerable<Chicken> results = null;
if (selectionSize == 0)
{
results = Enumerable.Empty<Chicken>();
}
else
{
results = from index in Range(selectionStart, selectionEnd)
where blah blah blah
select blah;
}