在等份中划分列表

时间:2011-03-21 19:02:11

标签: c# algorithm performance list

我有一个可能包含50,000个或更多项目的大型列表,我必须针对每个项目进行操作。如果我使用传统方法并按顺序操作,请立即花费X时间它肯定平均需要X * 50,000

我计划优化并节省一些时间,并决定使用Background Worker,因为它们之间没有依赖关系。计划将List分成4个部分,并将每个部分分开使用Background Worker

我想要ASK

1.这种方法是DUMB吗?

2.还有其他更好的方法吗?

3.建议一个漂亮而干净的方法将List分成4个相等的部分?

由于

4 个答案:

答案 0 :(得分:13)

如果您可以使用.Net 4.0,那么请使用任务并行库并查看

Parallel.ForEach()

Parallel ForEach How-to.

一切都与传统的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