有没有一种更优雅的方式来实现一次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)....也可能是我也编码长... :) –
我想我错过了你想要完成的事情。我的道歉 - 请参阅下面的答案。 –