假設我在列表中有23個元素。我怎樣才能做到每次取5個元素,最後一次取3個元素?有什麼像「takeN」方法,我可以用foreach或什麼東西?用takeN元素代替1的foreach
// myList is a list 23 elements
foreach (var x in myList) {
// x is a list with 5 elements
}
假設我在列表中有23個元素。我怎樣才能做到每次取5個元素,最後一次取3個元素?有什麼像「takeN」方法,我可以用foreach或什麼東西?用takeN元素代替1的foreach
// myList is a list 23 elements
foreach (var x in myList) {
// x is a list with 5 elements
}
你可以使用正常循環:
for(int i = 0; i < myList.Count; i += 5) { .. }
這可能是一個評論沒有答案 –
未經測試,但類似如下:
for (int i = 0; i < myList.Count; i += 5)
{
var sublist = myList.Skip(i).Take(5);
}
什麼是「什麼」?爲什麼「if(i> = myList.Length)」在裏面? –
很抱歉固定在那裏。 –
可以在兩個步驟做:
var groups = myList.Select((x,i) => new {X=x, I=i/5})
.GroupBy(xi => xi.I, xi => xi.X);
:
index/5
的片段值
示例程序RAM:
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;
}
}
錯誤的實現 - 它會多次評估輸入。 –
你可以替代(...),並擺脫乘法,不是嗎? –
@JonSkeet - 對,謝謝,編輯。 –
但是,使用外部庫只是一個簡單的擴展方法?我寧願實施我自己的'批'。 – SimpleVar
@SimpleVar:需要更少的時間來獲取依賴項,而不是實現它*並自己測試它 - 以及爲什麼假設這是您要使用的唯一的東西? –
@JonathanCarroll:不,這不是它的工作原理。它的工作原理是鏈接到我的帖子中的'Batch',它鏈接到實際的源代碼。 –