说我在列表中有23个元素。我如何做每次5个元素和最后3个元素?有没有像" takeN"我可以和foreach一起使用的方法吗?
// myList is a list 23 elements
foreach (var x in myList) {
// x is a list with 5 elements
}
答案 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;
}
}