Foreach使用takeN元素而不是1
本文关键字:元素 使用 takeN Foreach | 更新日期: 2023-09-27 18:22:13
假设我在一个列表中有23个元素。如何做foreach每次取5个元素,上次取3个元素?有什么类似"takeN"的方法可以用foreach或其他什么方法吗?
// myList is a list 23 elements
foreach (var x in myList) {
// x is a list with 5 elements
}
框架中没有任何内容,但您可以使用MoreLINQ的Batch
方法:
foreach (var sublist in myList.Batch(5))
{
// sublist has up to 5 elements
}
(在最后一次迭代中,它只有3个元素。)
未测试,但类似于以下内容:
for (int i = 0; i < myList.Count; i += 5)
{
var sublist = myList.Skip(i).Take(5);
}
您可以通过两个步骤完成:
- 创建一对值和索引
- 按
index/5
对值进行分组
摘录:
var groups = myList.Select((x,i) => new {X=x, I=i/5})
.GroupBy(xi => xi.I, xi => xi.X);
示例程序:
using System.Linq;
namespace BatchLinq
{
class Program
{
static void Main(string[] args)
{
var myList = Enumerable.Range(0, 23);
var groups = myList.Select((x,i) => new {X=x, I=i/5})
.GroupBy(xi => xi.I, xi => xi.X);
foreach (var group in groups)
System.Console.Out.WriteLine("{{ {0} }}", string.Join(", ", group));
}
}
}
输出为:
{ 0, 1, 2, 3, 4 }
{ 5, 6, 7, 8, 9 }
{ 10, 11, 12, 13, 14 }
{ 15, 16, 17, 18, 19 }
{ 20, 21, 22 }
编辑:
static IEnumerable<IEnumerable<T>> PrepareCollection<T>(List<T> input)
{
int cnt = 0;
while (cnt < input.Count)
{
IEnumerable<T> arr = input.Skip(cnt).Take(5);
cnt += 5;
yield return arr;
}
}
您可以使用正则for循环:
for(int i = 0; i < myList.Count; i += 5) { .. }