3

这是生成连续列表的干净正确方法uints吗?

演员表看起来有点难看,但我是初学者……可能有一种方法不用四处转换?

public class Test
{
    static readonly IEnumerable<uint> AvailableChannels 
         = (IEnumerable<uint>)Enumerable.Range(1,1000);
}
4

2 回答 2

8
static readonly IEnumerable<uint> AvailableChannels 
     = Enumerable.Range(1,1000)
       .Select(i => (uint)i)
       .ToList();

虽然它仍然是一个演员...

编辑
是这样 ,.ToList()每次循环遍历它时都不需要重新创建完整列表。(好吧,1000 个 uint 并不多,但它的原理是——如果它们是类,你每次都会创建新的类并得到意想不到的结果,比如丢失的更改)

EDIT2
Cast<uint>()运行时不起作用(“指定的演员表无效”)。更改为 a.Select以执行演员表。

于 2012-12-10T13:56:22.793 回答
7

您可以编写自己的可枚举方法:

public static IEnumerable<uint> Foo(
    uint startValue =0, 
    uint maxValue = uint.MaxValue
    )
{
    uint index = startValue;
    while(index < maxValue) {
        yield return index++;
    }
}

public static void Main()
{
    var myUints = Foo().Take(100);
    var myUints2 = Foo(startValue:0, maxValue:1000);
    var myUints3 = Foo(0, 1000);
    foreach(uint x in myUints) {
        Console.WriteLine(x);
    }
}

附注:如果性能是您的应用程序中的一个关键点,您可能会阅读这个问题:为什么 Enumerable.Range 比直接 yield 循环快?(尤其是标记为答案的答案)

于 2012-12-10T13:57:45.553 回答