如何在.NET 4.0中对并发集合进行排序

9

.NET 4.0中如何对并发集合进行排序? 例如,我已经构建了一个ConcurrentBag集合。那么我该如何对其中的元素进行排序?

ConcurrentBag<string> stringCollection;

ConcurrentBag<CustomType> customCollection;

2
你的意思是你想要一个新的排序集合,其中所有元素在某个时间点上都被排序了,还是你希望它始终保持排序状态,并按照顺序从中获取元素,或者类似这样的操作? - alun
我想使用一种方法对它进行排序,但是没有这样的方法,所以我不得不使用LINQ来进行排序。 - mitul patel
4个回答

8
为了进一步解释DSW的回答,您可以在可枚举对象上使用OrderBy。
customCollection.OrderBy(cc => cc.FieldToOrderBy);

你也可以按降序进行操作:
customCollection.OrderByDescending(cc => cc.FieldToOrderBy);

在排序过程中,集合是否可以被另一个线程更改?或者OrderBy会创建一个新的列表? - Dave Lawrence
1
OrderBy只是对新的IEnumerable进行排序,底层数据结构并不会改变。 - Berin Loritsch

6

您可以使用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.

但是对象仍然存在于并发集合中。我该如何删除最旧的项目? - Kim
使用.AsParallel()将我的执行时间在超过170万个项目中减少了一半。非常好的技巧。 - dyslexicanaboko

1

从集合中获取一个列表,对列表进行排序,例如:

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

1
哇,那是一种非常昂贵的做法! - tzup
1
是的,我认为是这样,我刚刚添加了一个替代方案,你认为这个应该被删除吗? - Jalal Said
即使刷新页面也看不到您的替代解决方案。无论如何,这取决于您,但我会将此答案保留原样。我认为它不会被投票否决,因为它并非无效。 - tzup

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接