通常我们使用计数器执行类似for或while循环的操作:
for (int i = 0; i < 10; i++)
{
list.Add(GetRandomItem());
}
Run Code Online (Sandbox Code Playgroud)
但有时你会混淆边界.你可以使用while循环,但如果你犯了一个错误,这个循环是无限的......
以Perl为例,我会使用更明显的
for(1..10){
list->add(getRandomItem());
}
Run Code Online (Sandbox Code Playgroud)
有没有像"doitXtimes(10){...}"这样的东西?
Jon*_*eet 62
那么你可以轻松编写自己的扩展方法:
public static void Times(this int count, Action action)
{
for (int i = 0; i < count; i++)
{
action();
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以写:
10.Times(() => list.Add(GetRandomItem()));
Run Code Online (Sandbox Code Playgroud)
我不确定我是否真的建议你这样做,但这是一个选择.我不相信框架中有类似的东西,尽管你可以使用Enumerable.Range
或Enumerable.Repeat
创建一个适当长度的懒惰序列,这在某些情况下很有用.
从C#6开始,您仍然可以方便地访问静态方法而无需创建扩展方法,使用using static
指令导入它.例如:
// Normally in a namespace, of course.
public class LoopUtilities
{
public static void Repeat(int count, Action action)
{
for (int i = 0; i < count; i++)
{
action();
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后当你想要使用它时:
using static LoopUtilities;
// Class declaration etc, then:
Repeat(5, () => Console.WriteLine("Hello."));
Run Code Online (Sandbox Code Playgroud)
Gro*_*ozz 41
foreach (var i in Enumerable.Range(0, N))
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
Pau*_*ane 34
可以创建一个IEnumerable
Int32:
Enumerable.Range(0, 10);
Run Code Online (Sandbox Code Playgroud)
该的ForEach扩展方法也是众所周知的(虽然不能与.NET发货).你可以将两者结合起来:
Enumerable.Range(0, 10).ForEach(index => ...);
Run Code Online (Sandbox Code Playgroud)
所以你的例子将成为:
Enumerable.Range(0, 10).ForEach(_ => list.Add(GetRandomItem()));
Run Code Online (Sandbox Code Playgroud)
Ale*_*sky 12
我看到Jon Skeet 打败了我,但是这个变化将允许你在每次运行时将索引传递给Action:
public static class IntegerExtensions
{
public static void TimesWithIndex(this int count, Action<int> action)
{
for (int i = 0; i < count; i++)
action(i);
}
}
Run Code Online (Sandbox Code Playgroud)
并称之为:
10.TimesWithIndex((i) =>
obj[i].DoSomething());
Run Code Online (Sandbox Code Playgroud)
while (i-- > 0) {
}
Run Code Online (Sandbox Code Playgroud)
你提到 while 循环很危险,因为它可能是无限的——上面的形式非常简单,永远不会是无限的。至少完全无限:)
它既方便又简短(比任何其他答案都短)并且将精确运行i次(因为后缀递减在递减之前返回值)。
还缺少一种方法:
List<T> list = System.Linq.Enumerable.Range(0, 10).Select(_ => GetRandomItem()).ToList();
Run Code Online (Sandbox Code Playgroud)
其中 T 是 GetRandomItem() 返回的类型
归档时间: |
|
查看次数: |
37767 次 |
最近记录: |