Foreach使用takeN元素而不是1

时间:2015-11-17 16:44:46

标签: c#

说我在列表中有23个元素。我如何做每次5个元素和最后3个元素?有没有像" takeN"我可以和foreach一起使用的方法吗?

// myList is a list 23 elements
foreach (var x in myList) {
  // x is a list with 5 elements
}

5 个答案:

答案 0 :(得分:4)

框架中没有任何内容,但您可以使用MoreLINQ Batch方法:

foreach (var sublist in myList.Batch(5))
{
    // sublist has up to 5 elements
}

(在最后的迭代中,它只有3个元素。)

答案 1 :(得分:1)

未经过测试,但是这样:

        for (int i = 0; i < myList.Count; i += 5)
        {
            var sublist = myList.Skip(i).Take(5);
        }

答案 2 :(得分:0)

您可以使用常规for循环:

for(int i = 0; i < myList.Count; i += 5) { .. }

答案 3 :(得分:0)

您可以分两步完成:

  • 创建一对值和索引
  • 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 }

答案 4 :(得分:0)

编辑:

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;
    }
}