簡體   English   中英

在等份中划分列表

[英]Divide List in Equal Parts

我有可能有一些大名單50,000以上的項目,我所要做的操作對每個item.takes一些X現在的時間,如果我用傳統的方法,並做以連續的方式操作它絕對需要X * 50,000平均。

我計划優化並節省一些時間,並決定使用Background Worker因為它們之間沒有依賴關系。計划將List分成4個部分,並在單獨的Background Worker使用它們。

我想問問

這個方法是DUMB嗎?

2.還有其他更好的方法嗎?

3.建議一個漂亮而干凈的方法將List分成4個相等的部分?

謝謝

如果您可以使用.Net 4.0,那么請使用任務並行庫並查看

Parallel.ForEach()

並行ForEach操作方法。

一切都與傳統的for循環基本相同,但你隱式使用並行性。

您還可以將其拆分為組。

我沒有看到它的內置序列方法,所以這是低級方式。 請指出任何錯誤。 我在學習。

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;
    }

另一個版本,基於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;
}

這是優化大型集合上類似,獨立操作的好方法。 但是,您應該查看.NET 4.0中的Parallel.For方法。 它為您完成所有繁重的工作:

http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.for.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM