有没有“最高”?方法

本文关键字:方法 最高 有没有 | 更新日期: 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#中可能吗?

有没有“最高”?方法

将其转换为扩展方法(注意thisn参数之前,它定义了该方法操作的类型):

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,可能与TakeTakeWhile结合使用:

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));

希望这对你有帮助!:)