如何使用连续单位填充IEnumerable

时间:2012-12-10 13:53:57

标签: c#

这是一种生成连续uints列表的简洁方法吗?

演员看起来有些丑陋,但我是初学者......可能有一种方法没有施展?

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

2 个答案:

答案 0 :(得分:8)

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

它仍然是演员...

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

<强> EDIT2
Cast<uint>()在运行时不起作用(“指定的强制转换无效”)。已更改为.Select以执行演员。

答案 1 :(得分: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);
    }
}

附注:如果性能是您应用程序中的关键点,您可以阅读以下问题:Why is Enumerable.Range faster than a direct yield loop?(特别是标记为答案的答案)