C# 多次重复 IEnumerable
C# repeating IEnumerable multiple times
如何多次重复整个IEnumerable
?
类似于Python:
> print ['x', 'y'] * 3
['x', 'y', 'x', 'y', 'x', 'y']
您可以使用普通 LINQ 来执行此操作:
var repeated = Enumerable.Repeat(original, 3)
.SelectMany(x => x);
或者你可以只写一个扩展方法:
public static IEnumerable<T> Repeat<T>(this IEnumerable<T> source,
int count)
{
for (int i = 0; i < count; i++)
{
foreach (var item in source)
{
yield return count;
}
}
}
请注意,在这两种情况下,序列都会在每个 "repeat" 上重新评估 - 因此它可能会给出不同的结果,甚至是不同的长度......确实,有些序列无法评估不止一次。你需要小心你用什么做这件事,基本上:
- 如果您知道序列只能被评估一次(或者您希望从不一致的序列中获得一致的结果)但您乐于将评估结果缓冲在内存中,您可以先调用
ToList()
并在 上调用 Repeat
- 如果你知道这个序列可以多次求值,只要像上面那样调用
Repeat
- 如果以上两种情况你都没有,根本就没有办法多次重复序列元素
如何多次重复整个IEnumerable
?
类似于Python:
> print ['x', 'y'] * 3
['x', 'y', 'x', 'y', 'x', 'y']
您可以使用普通 LINQ 来执行此操作:
var repeated = Enumerable.Repeat(original, 3)
.SelectMany(x => x);
或者你可以只写一个扩展方法:
public static IEnumerable<T> Repeat<T>(this IEnumerable<T> source,
int count)
{
for (int i = 0; i < count; i++)
{
foreach (var item in source)
{
yield return count;
}
}
}
请注意,在这两种情况下,序列都会在每个 "repeat" 上重新评估 - 因此它可能会给出不同的结果,甚至是不同的长度......确实,有些序列无法评估不止一次。你需要小心你用什么做这件事,基本上:
- 如果您知道序列只能被评估一次(或者您希望从不一致的序列中获得一致的结果)但您乐于将评估结果缓冲在内存中,您可以先调用
ToList()
并在 上调用 - 如果你知道这个序列可以多次求值,只要像上面那样调用
Repeat
- 如果以上两种情况你都没有,根本就没有办法多次重复序列元素
Repeat