有沒有一種更優雅的方式來實現一次5個項目比這樣的for循環?有沒有另一種方法可以每次取N而不是for循環?
var q = Campaign_stats.OrderByDescending(c=>c.Leads).Select(c=>c.PID).Take(23);
var count = q.Count();
for (int i = 0; i < (count/5)+1; i++)
{
q.Skip(i*5).Take(5).Dump();
}
有沒有一種更優雅的方式來實現一次5個項目比這樣的for循環?有沒有另一種方法可以每次取N而不是for循環?
var q = Campaign_stats.OrderByDescending(c=>c.Leads).Select(c=>c.PID).Take(23);
var count = q.Count();
for (int i = 0; i < (count/5)+1; i++)
{
q.Skip(i*5).Take(5).Dump();
}
所以要有效地呼籲每5項Dump()
在q
。
您現在的解決方案將每次通過for
循環重新循環訪問IEnumerable<T>
。它可能是更有效地做這樣的事情:(我不知道你的類型,所以我使用T
什麼)
const int N = 5;
T[] ar = new T[N]; // Temporary array of N items.
int i=0;
foreach(var item in q) { // Just one iterator.
ar[i++] = item; // Store a reference to this item.
if (i == N) { // When we have N items,
ar.Dump(); // dump them,
i = 0; // and reset the array index.
}
}
// Dump the remaining items
if (i > 0) {
ar.Take(i).Dump();
}
這隻能使用一個迭代器。考慮到你的變量被命名爲q
,我假設它是「查詢」的縮寫,這意味着這是針對數據庫的。所以只使用一個迭代器可能是非常有益的。
我可以保留這段代碼,並用擴展方法包裝它。 「叢」如何?
public static IEnumerable<IEnumerable<T>> Clump<T>(this IEnumerable<T> items, int clumpSize) {
T[] ar = new T[clumpSize];
int i=0;
foreach(var item in items) {
ar[i++] = item;
if (i == clumpSize) {
yield return ar;
i = 0;
}
}
if (i > 0)
yield return ar.Take(i);
}
調用它在你的代碼的情況下:
foreach (var clump in q.Clump(5)) {
clump.Dump();
}
+1。也許「SliceBy」(類似於GroupBy)會是更好的名字。這裏是答案(可以找到與「[C#]切片IEnumerable」)討論選項 - http://stackoverflow.com/questions/1349491/how-can-i-split-an-ienumerablestring-into-groups-的-ienumerablestring。 –
附註:你目前的代碼有錯誤,沒有報告上一個塊(即items.Count()== 1) –
@AlexeiLevenkov修復! –
嘗試通過迭代5,而不是!
for(int i = 0; i < count; i += 5)
{
//etc
}
添加更多LINQ用的GroupBy和郵編:
q
// add indexes
.Zip(Enumerable.Range(0, Int32.MaxValue),(a,index)=> new {Index=index, Value=a})
.GroupBy(m=>m.Index /5) // divide in groups by 5 items each
.Select(k => {
k.Select(v => v.Value).Dump(); // Perform operation on 5 elements
return k.Key; // return something to satisfy Select.
});
哇,我永遠不會想到這個 - 酷 –
@AaronAnodide,這主要是爲了好玩 - Jonathon Reinhart的答案顯然更好,因爲GroupBy不適合大型收藏。如果你想留在LINQ - 聚合會更好的選擇。 –
哇。對不起,但從其他代碼的外觀來看,我真的**不相信你必須提出這個問題。 –
嗯..我在想有人可能知道如何讓迭代器從停止的地方恢復或什麼,所以我可以說像while(items.HasMore)採取(5)....也可能是我也編碼長... :) –
我想我錯過了你想要完成的事情。我的道歉 - 請參閱下面的答案。 –