C#中有“upto”方法吗?

这里有一些代码打印出从0到9的数字的平方:

for (int i = 0; i < 10; i++) Console.WriteLine(i*i); 

通过for循环从0到N加1是一个非常常见的习惯用法。

这是一个UpTo方法,表达了这个:

 class MathUtil { public static void UpTo(int n, Action proc) { for (int i = 0; i < n; i++) proc(i); } } 

上面的方块示例现在是:

 MathUtil.UpTo(10, (i) => Console.WriteLine(i * i)); 

我的问题是,标准的C#库是否带有类似上面的UpTo

理想情况下,我想要一种方法让’UpTo’成为所有整数对象的方法。 所以我能做到:

 var n = 10; n.UpTo(...); 

这可能在C#中吗?

把它变成一个扩展方法 (在n参数之前注意这个 ,它定义了这个方法操作的类型):

 static class MathUtil { public static void UpTo(this int n, Action proc) { for (int i = 0; i < n; i++) proc(i); } } 

用法:

 10.UpTo((i) => Console.WriteLine(i * i)); 

注意:上述方法调用虽然不是特别直观。 记住代码只写一次并多次读取。

也许允许像下面这样的东西可能稍好一些,但老实说我还是只写一个foreach循环。

 0.UpTo(10 /*or 9 maybe*/, (i) => Console.WriteLine(i * i)); 

如果你想要这个,那么你可以写一个像这样的扩展方法:

 public static void UpTo(this int start, int end, Action proc) { for (int i = start; i < end; i++) proc(i); } 

如果您想要包含上限,请将<=更改为<=

看看LINQ TakeWhile或您的特定整数情况,请使用Enumerable.Range

 Enumerable.Range(1, 10).Select(i => ...); 

可以说你不应该在那里放置一个Action,请在这里查看关于ForEach的评论 。

试试这个:

 public static class IntExtensions { public static void UpTo(this int n, Action proc) { for (int i = 0; i < n; i++) proc(i); } } 

有了这个,你可以写

 10.UpTo(i => Console.WriteLine(i * i)); 

我写的函数叫做扩展方法
在设计时,您注意到它不是本机函数,因为它具有不同的图标。
Estension方法是静态类中包含的静态方法或函数,它们使用的类型是必须使用this关键字的第一个参数。
IntExtensions类中,您可以编写所有方法; 将它们分组到同一个静态类中可以让您轻松管理它们。

想在一条线上做吗? 它在这里:

 Enumerable.Range(0, 9).Select(i => i * i).ToList().ForEach(j=>Console.WriteLine("%d",j)); 

尝试Enumerable.Range ,可能与TakeTakeWhile结合使用:

 IEnumerable values = Enumerable.Range(0, 20) .Take(10); // Not necessary in this example foreach(var value in values) { Console.WriteLine(value); } // or ... foreach(var i in Enumerable.Range(0, 10)) { Console.WriteLine(i * i); } 

List上有一个ForEach ,您可以使用它来更接近您想要的语法,但我认为它是不好的forms。 它采用纯查询/filter/转换语法,以有效的不可变方式工作,并引入副作用。

为了您将来的娱乐,您可能需要查看扩展方法 , IEnumerableyield return 。 当您将这三种内容组合使用时,可以实现许多生成器类型的function和有趣的语法。 虽然我认为这个特定的例子不是使用它们的最佳位置,因为结果语法变得一团糟。

像在静态类“Extensions”中那样使用这样的方法:

 public static void UpTo(this int n, Action proc) { for (var i = 0; i < n; i++) proc(i); } 

用法:

 var n = 10; n.UpTo(i => Console.WriteLine(i * i)); 

希望这可以帮助! 🙂