Как отсортировать параллельную коллекцию в .NET 4.0 - PullRequest
8 голосов
/ 09 августа 2011

Как отсортировать одновременную коллекцию в .NET 4.0 Например, я создал свою коллекцию ConcurrentBag. Как я могу отсортировать элементы в нем?

ConcurrentBag<string> stringCollection;

ConcurrentBag<CustomType> customCollection;

Ответы [ 4 ]

6 голосов
/ 09 августа 2011

Чтобы расширить ответ DSW, вы можете использовать OrderBy для перечислимого.

customCollection.OrderBy(cc => cc.FieldToOrderBy);

Вы также можете сделать это в порядке убывания:

customCollection.OrderByDescending(cc => cc.FieldToOrderBy);
3 голосов
/ 09 августа 2011

Вы можете использовать OrderBy метод для сортировки

, а также попробовать это тоже.

var result = stringCollection.AsParallel().AsOrdered();

для получения дополнительной информации проверьте ниже ссылку

http://msdn.microsoft.com/en-us/library/dd460719.aspx, вы можете понять, как сделать сложную сортировку, используя PLINQ, например:

 var q2 = orders.AsParallel()
       .Where(o => o.OrderDate < DateTime.Parse("07/04/1997"))
       .Select(o => o)
       .OrderBy(o => o.CustomerID) // Preserve original ordering for Take operation.
       .Take(20)
       .AsUnordered()  // Remove ordering constraint to make join faster.
       .Join(
              orderDetails.AsParallel(),
              ord => ord.OrderID,
              od => od.OrderID,
              (ord, od) =>
              new
              {
                  ID = ord.OrderID,
                  Customer = ord.CustomerID,
                  Product = od.ProductID
              }
             )
       .OrderBy(i => i.Product); // Apply new ordering to final result sequence.
1 голос
/ 12 августа 2011

вы можете использовать PLINQ или написать собственную реализацию функции параллельной сортировки, как в этой статье http://www.emadomara.com/2011/08/parallel-merge-sort-using-barrier.html

0 голосов
/ 09 августа 2011

Получить список из коллекции, отсортировать список, как:

ConcurrentBag<string> bag = new ConcurrentBag<string>();

var temp = bag.ToList();
temp.Sort();//you can apply a custom sort delegate here

bag = new ConcurrentBag<string>(temp);
...