在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)
的可读性的想法答案 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#中表达这一点是完全可以接受的。