6

有没有比这样的 for 循环更优雅的方法来一次实现 5 个项目?

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();
}
4

4 回答 4

11
for(int i = 0; i <= count; i+=5)
{
}
于 2012-10-11T04:58:52.623 回答
5

因此,您希望有效地Dump()调用q.

IEnumerable<T>您现在拥有的解决方案将在每次循环中重新迭代for。做这样的事情可能更有效:(我不知道你的类型是什么,所以我正在使用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();
}
于 2012-10-11T05:09:46.210 回答
1

尝试迭代 5 !

for(int i = 0; i < count; i += 5) 
{
   //etc
}
于 2012-10-11T04:59:36.477 回答
1

使用 GroupBy 和 Zip 添加更多 LINQ:

 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.
});
于 2012-10-11T05:19:54.650 回答