有没有“最高”?方法
本文关键字:方法 最高 有没有 | 更新日期: 2023-09-27 18:14:49
下面这段代码打印出从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<int> 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#中可能吗?
将其转换为扩展方法(注意this在n
参数之前,它定义了该方法操作的类型):
static class MathUtil
{
public static void UpTo(this int n, Action<int> 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<int> proc)
{
for (int i = start; i < end; i++)
proc(i);
}
<
更改为<=
。
看看LINQ TakeWhile,或者对于特定的整数,使用Enumerable。范围
Enumerable.Range(1, 10).Select(i => ...);
可以说你不应该在结尾放一个Action,看这里ForEach的注释
试试这个:
public static class IntExtensions
{
public static void UpTo(this int n, Action<int> proc)
{
for (int i = 0; i < n; i++)
proc(i);
}
}
你可以这样写
10.UpTo(i => Console.WriteLine(i * i));
我写的函数叫做扩展方法。
在设计时,你会注意到它不是一个本地函数,因为它有一个不同的图标。
扩展方法是静态类中包含的静态方法或函数,它们所处理的类型是必须使用this
关键字的第一个参数。
在IntExtensions
类中,你可以编写所有你喜欢的方法;将它们分组在同一个静态类中使您可以轻松地管理它们。
想在一行完成吗?是这样的:
Enumerable.Range(0, 9).Select(i => i * i).ToList().ForEach(j=>Console.WriteLine("%d",j));
尝试Enumerable.Range
,可能与Take
或TakeWhile
结合使用:
IEnumerable<int> 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<T>
上有一个ForEach
,你可以使用它来获得更接近你想要的语法,但我认为它的形式不好。它采用纯查询/过滤/转换语法,以有效的不可变方式工作,并引入了副作用。
为了你将来的娱乐,你可能想看看扩展方法,IEnumerable<T>
和yield return
。当您将这三者结合使用时,许多生成器类型的功能和有趣的语法将成为可能。尽管我认为这个特定的示例不是使用它们的最佳场所,因为生成的语法会变得一团糟。
在静态类"Extensions"中创建这样的方法,例如:
public static void UpTo(this int n, Action<int> proc)
{
for (var i = 0; i < n; i++)
proc(i);
}
和用法:
var n = 10;
n.UpTo(i => Console.WriteLine(i * i));
希望这对你有帮助!:)