我有一个可能包含50,000
个或更多项目的大型列表,我必须针对每个项目进行操作。如果我使用传统方法并按顺序操作,请立即花费X
时间它肯定平均需要X * 50,000
。
我计划优化并节省一些时间,并决定使用Background Worker
,因为它们之间没有依赖关系。计划将List分成4个部分,并将每个部分分开使用Background Worker
。
我想要ASK
1.这种方法是DUMB吗?
2.还有其他更好的方法吗?
3.建议一个漂亮而干净的方法将List分成4个相等的部分?
由于
答案 0 :(得分:13)
如果您可以使用.Net 4.0,那么请使用任务并行库并查看
Parallel.ForEach()
一切都与传统的for循环基本相同,但你隐式使用并行性。
答案 1 :(得分:2)
您还可以将其真正拆分为群组。
我没有看到它的内置序列方法,所以这里是低级方式。请指出任何错误。我正在学习。
static List<T[]> groups<T>(IList<T> original, uint n)
{
Debug.Assert(n > 0);
var listlist = new List<T[]>();
var list = new List<T>();
for (int i = 0; i < original.Count(); i++)
{
var item = original[i];
list.Add(item);
if ((i+1) % n == 0 || i == original.Count() - 1)
{
listlist.Add(list.ToArray());
list.Clear();
}
}
return listlist;
}
答案 2 :(得分:1)
另一个版本,基于linq。
public static List<T[]> groups<T>(IList<T> original, uint n)
{
var almost_grouped = original.Select((row, i) => new { Item = row, GroupIndex = i / n });
var groups = almost_grouped.GroupBy(a => a.GroupIndex, a => a.Item);
var grouped = groups.Select(a => a.ToArray()).ToList();
return grouped;
}
答案 3 :(得分:0)
这是优化大型集合上类似,独立操作的好方法。但是,您应该查看.NET 4.0中的Parallel.For方法。它为你做了所有繁重的工作:
http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.for.aspx