9

How to sort a concurrent collection in .NET 4.0 For example I have constructed my ConcurrentBag collection. How can I sort the elements in it?

ConcurrentBag<string> stringCollection;

ConcurrentBag<CustomType> customCollection;
Jalal Said
  • 15,906
  • 7
  • 45
  • 68
mitul patel
  • 101
  • 1
  • 1
  • 3
  • 2
    Do you mean that you want a new sorted collection with all the elements at some point in time or do you want it to be sorted all the time and draw from it in that order or something to that effect? – alun Aug 09 '11 at 04:33
  • I wanted to sort it using a method but there isn't any so I have to use LINQ to do the sorting. – mitul patel Aug 09 '11 at 06:22

4 Answers4

8

To expand on DSW's answer, you can use the OrderBy on an enumerable.

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

You can also do it in descending order:

customCollection.OrderByDescending(cc => cc.FieldToOrderBy);
evasilchenko
  • 1,862
  • 1
  • 13
  • 26
6

you can use OrderBy method for sorting

and also try this too..

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

for more information check below link

http://msdn.microsoft.com/en-us/library/dd460719.aspx, you can lean how to do complex sorting using PLINQ, e.g:

 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.
Damith
  • 62,401
  • 13
  • 102
  • 153
1

you can either use PLINQ or you can write implement your own parallel sort function like the one in this article http://www.emadomara.com/2011/08/parallel-merge-sort-using-barrier.html

Emad Omara
  • 512
  • 4
  • 3
0

Get a list from the collection, sort the list, like:

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);
Jalal Said
  • 15,906
  • 7
  • 45
  • 68
  • 1
    Man, that's one expensive way to do it! – tzup Aug 09 '11 at 09:23
  • 1
    Yes I think so, I just added an alternative solution, do you think this should be deleted? – Jalal Said Aug 09 '11 at 09:24
  • Can't see your alternative solution even after refreshing the page. Anyway, it is up to you, but I would leave this answer as is. Don't think it will get voted down since it is not invalid. – tzup Aug 09 '11 at 09:35