2012-10-11 50 views
5

有没有一种更优雅的方式来实现一次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(); 
} 
+1

哇。对不起,但从其他代码的外观来看,我真的**不相信你必须提出这个问题。 –

+0

嗯..我在想有人可能知道如何让迭代器从停止的地方恢复或什么,所以我可以说像while(items.HasMore)采取(5)....也可能是我也编码长... :) –

+0

我想我错过了你想要完成的事情。我的道歉 - 请参阅下面的答案。 –

回答

5

所以要有效地呼吁每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(); 
} 
+0

+1。也许“SliceBy”(类似于GroupBy)会是更好的名字。这里是答案(可以找到与“[C#]切片IEnumerable”)讨论选项 - http://stackoverflow.com/questions/1349491/how-can-i-split-an-ienumerablestring-into-groups-的-ienumerablestring。 –

+1

附注:你目前的代码有错误,没有报告上一个块(即items.Count()== 1) –

+0

@AlexeiLevenkov修复! –

11
for(int i = 0; i <= count; i+=5) 
{ 
} 
+0

+1好,并且快速:) – Habib

+0

感谢您的格式化。 – idstam

1

尝试通过迭代5,而不是!

for(int i = 0; i < count; i += 5) 
{ 
    //etc 
} 
1

添加更多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. 
}); 
+0

哇,我永远不会想到这个 - 酷 –

+0

@AaronAnodide,这主要是为了好玩 - Jonathon Reinhart的答案显然更好,因为GroupBy不适合大型收藏。如果你想留在LINQ - 聚合会更好的选择。 –

相关问题