2012-10-11 47 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 - 聚合會更好的選擇。 –

相關問題