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
}

Foreach使用takeN元素而不是1

框架中没有任何内容,但您可以使用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) { .. }
相关文章: