生成一系列数字

18

我想在 asp.net mvc2 中创建序列号。

序列号应该从{0到1000}开始。我尝试像下面这样:

 var seq = Enumerable.Range(1, 1000);
        ViewData["OrderNo"] = seq;

考虑到:

 <%:Html.Hidden("OrderNo") %>
            <%:ViewData["OrderNo"] %>  

我的结果是

System.Linq.Enumerable+<RangeIterator>d__b8

但是,在视图中获取值时它不起作用...如何生成连续的数字?


是的,这是你问我的好问题。每当用户点击按钮时,它将生成作为序列号的订单... 没有限制.. 我以1000为例... - PoliDev
1
“不起作用”是什么意思?Enumerable.Range肯定是有效的。你期望发生什么,实际上又发生了什么?如果你不想从1开始,为什么把1作为起始数字呢? - Panagiotis Kanavos
不是问题。我只想从1开始。但我的结果显示为空值。 - PoliDev
1
请编辑问题并添加具体问题。您所谈论的结果是什么,它为空的位置在哪里?请添加相关代码。另外尝试通过在范围后调用ToArray()来存储一个数组,而不是一个IEnumerable。 - Panagiotis Kanavos
我更新了我的问题,请检查并帮助我。 - PoliDev
2个回答

38

如果您想枚举一系列数字(IEnumerable<int>)从 0 到一个变量 end,那么请尝试

Enumerable.Range(0, ++end);

简要说明,如果要获得从0到1000的数字序列,您希望序列以0开始(记住0和1000之间有1001个数字,包括0和1000在内)。


如果您想要一个无限的线性序列,您可以编写以下函数:

IEnumerable<int> Series(int k = 0, int n = 1, int c = 1)
{
    while (true)
    {
        yield return k;
        k = (c * k) + n;
    }
}

你可以像使用这样

var ZeroTo1000 = Series().Take(1001);
如果您想要一个可重复调用的函数生成递增数字,也许您需要像这样的东西。
using System.Threading;

private static int orderNumber = 0;

int Seq()
{
    return Interlocked.Increment(ref orderNumber);
}

当你调用 Seq() 函数时,它将返回下一个顺序号并递增计数器。


如果“无限制”是什么意思?我想从1开始,但我不知道结束值。 - PoliDev
非常感谢您。Interlocked是什么?它在VS 2010 MVC2中不支持吗? - PoliDev
@AngDei,它应该可以正常工作。您需要引用 System.Threading http://msdn.microsoft.com/en-us/library/dd78zt0c(v=vs.100).aspx - Jodrell

8
不清楚您的意思或者您认为什么是失败,但Enumerable.Range的参数是startcount,而不是startend
如果您想生成从0到1000的数字,您需要编写如下代码:
Enumerable.Range(0,1001);

如果您遇到不同的问题(例如序列在用户调用之间或从一个用户到另一个用户之间不连续),您需要具体说明。
也许您的意思是,您在视图中存储在ViewData中的IEnumerable没有按照您的预期进行持久化?这是因为Range返回一个实现IEnumerable并使用延迟执行来生成请求的值的对象。除非您使用for或ToArray()强制枚举,否则数字根本不会生成。将对象存储在某个地方并不会强制枚举。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接