3

在 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),例如?或者,“到”是一个坏词吗?像 1.Through(100) 这样的东西更具可读性吗?

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

编辑: 阅读回复后,我使用范围重写了我的 To 方法:

public static int[] To(this int start, int end)
{
    return Enumerable.Range(start, end - start + 1).ToArray();
}

我仍在寻找有关 1.To(100) 可读性的想法

4

5 回答 5

8

Enumerable.Range(1, 100);

于 2008-12-16T13:07:06.993 回答
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();
于 2008-12-16T13:17:39.577 回答
0

我认为类似Set(1,100)IntSequence(1,100)比使用扩展方法更容易阅读。

不过个人意见...

于 2008-12-16T13:09:10.780 回答
0

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

public static int[] To(this int num)
    {
        //do work
    }
于 2008-12-16T16:32:43.193 回答
0

我认为您太担心该语言无法准确表达您想要的特定句法内容。

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

在 C# 语言的领域内,通过方法名称拼出您要执行的操作更为合适。这感觉更像 Ruby 而不是 C#。这感觉更像是它想独自上课,特别是如果您想添加带有跳过模式的范围(即,从 1 到 10 的数字,三个)。我觉得

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

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

于 2008-12-16T17:12:02.833 回答