是否有一个「;高达;C#中的方法?

是否有一个「;高达;C#中的方法?,c#,C#,这里有一段代码,可以打印出0到9之间的数字的平方: for (int i = 0; i < 10; i++) Console.WriteLine(i*i); 上面的正方形示例现在是: MathUtil.UpTo(10, (i) => Console.WriteLine(i * i)); 我的问题是,标准C#library是否提供了类似上述到的功能 理想情况下,我希望有一种方法可以使“UpTo”成为所有整数对象上的一个方法。所以我可以做: var n = 10; n.Up

这里有一段代码,可以打印出0到9之间的数字的平方:

for (int i = 0; i < 10; i++)
    Console.WriteLine(i*i);
上面的正方形示例现在是:

MathUtil.UpTo(10, (i) => Console.WriteLine(i * i));
我的问题是,标准C#library是否提供了类似上述
的功能

理想情况下,我希望有一种方法可以使“UpTo”成为所有整数对象上的一个方法。所以我可以做:

var n = 10;

n.UpTo(...);
在C#?

中将其转换为(注意
n
参数前面的this,该参数定义了此方法操作的类型):


注意:但是上面的方法调用并不特别直观。请记住,代码编写一次,阅读多次

也许允许像下面这样的操作会稍微好一点,但老实说,我还是会编写一个
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);
}
publicstaticvoid-up(此int-start、int-end、Action-proc)
{
for(int i=start;i
更改
查看LINQ,或者对于整数的特定情况,使用

可以说,您不应该在末尾执行操作,请参见。

尝试以下操作:

public static class IntExtensions
{
    public static void UpTo(this int n, Action<int> proc)
    {
        for (int i = 0; i < n; i++)
            proc(i);
    }
}
我编写的函数称为扩展方法
在设计时,您会注意到它不是一个本机函数,因为它有一个不同的图标。
Estension方法是静态类中包含的静态方法或函数,它们所使用的类型是您必须使用
this
关键字的第一个参数。

IntExtensions
类中,您可以编写自己喜欢的所有方法;在同一个静态类中对它们进行分组可以使您轻松管理它们。

尝试
可枚举的.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);
}
IEnumerable values=可枚举范围(0,20)
.拿(10);//在这个例子中没有必要
foreach(值中的var值)
{
控制台写入线(值);
}
//或者。。。
foreach(可枚举范围(0,10)中的VarI)
{
控制台写入线(i*i);
}
<>代码< >代码>清单> <代码>,你可以使用它来接近你想要的语法,但是我认为它是坏的形式。它采用了纯查询/过滤/转换语法,以一种有效的不可变方式工作,并引入了副作用


为了您将来的娱乐,您可能想退房,然后。当您将这三种功能结合使用时,许多生成器类型的功能和有趣的语法就成为可能。尽管我认为这个特定的示例不是使用它们的最佳位置,因为生成的语法变得混乱。

在静态类“扩展”中使用这样的方法,例如:

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

希望这有帮助!:)

想一行完成吗?下面是:

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

我知道这是OP要求的,但是语法很糟糕:
10.UpTo(I=>Console.WriteLine(I*I))。。。这对我来说毫无意义,除非我知道扩展方法和它们提供的肮脏技巧:)我们有一个赢家!谢谢乔治@乔治达克特:修正后的答案解决了我所有的担忧。游戏打得好我更喜欢
0.UpTo(10,/*blah*/)
版本,它更直观,可读性更强。Ruby有一个
times
方法,可以处理整数。这是名字的另一个选择。普通的Lisp有一个<代码> doTime/Cux>宏。它可能是一个味道的问题,但是我认为变体的<代码>比 uto 更可读。此外,在
变量中修改起始编号(
0
)或递增方法(
i++
)非常容易。我想也可以在这里申请。@Heinzi感谢Eric文章的链接!。NET Extensions Methods()具有用于此的扩展方法<代码>5次(…)
这让我想起了一篇关于新的“goes to”(->)和“is approach by”(@yas4891:fully stuff:)的优秀文章,'ToList()'需要调用'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));
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);
}
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));
Enumerable.Range(0, 9).Select(i => i * i).ToList().ForEach(j=>Console.WriteLine("%d",j));