Разделить список на равные части - PullRequest
2 голосов
/ 21 марта 2011

У меня есть большой список, в котором может быть несколько 50,000 или более элементов, и я должен выполнить операцию с каждым элементом. Теперь занимает некоторое время X, если я использую обычный метод и выполняю операцию последовательно, это определенно потребуетX * 50,000 в среднем.

Я планировал оптимизировать и сэкономить некоторое время и решил использовать Background Worker, поскольку между ними нет никакой зависимости. Планировалось разделить Список на 4 части и использовать каждую в отдельности Background Worker.

Я хочу спросить

1.Этот метод DUMB?

2. Есть ли какой-нибудь другой лучший метод?

3. Предложите хороший и чистый метод, чтобы разделить Список на 4 равные части?

Спасибо

Ответы [ 4 ]

13 голосов
/ 21 марта 2011

Если вы можете использовать .Net 4.0, то используйте библиотеку Task Parallel и посмотрите на

Parallel.ForEach()

Parallel ForEach How-to.

Все в основном совпадает с традиционным циклом for, но вы работаете с параллелизмом неявно.

2 голосов
/ 16 июня 2011

Вы также можете разделить его на группы.

Я не видел встроенный метод последовательности для него, так что вот низкоуровневый способ.укажите на любые ошибки, пожалуйста.Я учусь.

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;
    }
1 голос
/ 29 июля 2011

Другая версия, основанная на 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;
}
0 голосов
/ 21 марта 2011

Это хороший метод для оптимизации похожих, независимых операций над большой коллекцией. Однако вы должны посмотреть на метод Parallel.For в .NET 4.0. Он делает всю тяжелую работу за вас:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...