在C#中生成整数集

时间:2008-12-16 13:04:32

标签: c# set

在F#中,只需说出[1..100]即可生成一组数字。

我想在C#中做类似的事情。这是我到目前为止所提出的:

public static int[] To(this int start, int end)
{
    var result = new List<int>();
    for(int i = start; i <= end; i++)
        result.Add(i);
    return result.ToArray();
}

通过这样做,我现在可以通过说1.To(100)

创建一个集合

不幸的是,这并不像[1..100]那样可读。有没有人想出更好的方法在C#中做到这一点?如果它是小写的,它是否更具可读性? 1.to(100),例如?或者,“To”是一个坏词?类似于1.Through(100)更具可读性吗?

只是寻找一些想法。有没有其他人想出更优雅的解决方案?

修改 阅读完回复后,我使用范围:

重新编写了我的To方法
public static int[] To(this int start, int end)
{
    return Enumerable.Range(start, end - start + 1).ToArray();
}

我仍在寻找关于1.To(100)

的可读性的想法

6 个答案:

答案 0 :(得分:8)

Enumerable.Range(1,100);

答案 1 :(得分:5)

我喜欢使用To的想法。替代Enumerable.Range有一个微妙的缺陷imo。第二个参数是最后一个元素的,它是枚举的长度。这就是我过去所做的:

public IEnumerable<int> To(this int start, int stop)
{
  while (start <= stop)
    yield return start++;
}

编辑:如果您希望结果为int[],只需添加.ToArray()

int[] theSet = 1.To(100).ToArray();

答案 2 :(得分:0)

您可以查看涉及枚举器和yield语句的内容吗?

答案 3 :(得分:0)

我认为像Set(1,100)IntSequence(1,100)这样的内容比使用扩展方法更容易阅读。

个人意见虽然......

答案 4 :(得分:0)

你对自己问题的回答很好。如果您担心性能,请不要使用List。构建列表并不断扩展它是愚蠢的。只需构造一个适当大小的数组。使用扩展方法

public static int[] To(this int num)
    {
        //do work
    }

答案 5 :(得分:0)

我认为你太担心这种语言并不完全表达你想要的特定语法。

我看到它的方式,扩展方法是一个很好的糖,但我想知道你是否真的用它来证明扩展方法的“惊喜”。

在C#语言的范围内,通过方法名称拼写出你想要做的事情更合适。这感觉更像Ruby而不是C#。这种感觉更像是想要自己上课,特别是如果你想用跳过模式添加范围(即数字从1到10三分之一)。我想那个

public class RangedArray {
    public static int[] Generate(int from, into to, int by=1) { /* ... */ }
}

在C#中表达这一点是完全可以接受的。