2011-08-09 12 views
5

Cách sắp xếp bộ sưu tập đồng thời trong .NET 4.0 Ví dụ: tôi đã tạo bộ sưu tập ConcurrentBag của mình. Làm thế nào tôi có thể sắp xếp các yếu tố trong đó?Cách sắp xếp bộ sưu tập đồng thời trong .NET 4.0

ConcurrentBag<string> stringCollection; 

ConcurrentBag<CustomType> customCollection; 
+2

Bạn có nghĩa là bạn muốn một bộ sưu tập mới được sắp xếp với tất cả các phần tử tại một thời điểm nào đó hoặc bạn có muốn nó được sắp xếp mọi lúc và vẽ từ nó theo thứ tự đó hay cái gì đó có hiệu lực không? – alun

+0

Tôi muốn sắp xếp nó bằng cách sử dụng một phương pháp nhưng không có bất kỳ vì vậy tôi phải sử dụng LINQ để làm việc phân loại. –

Trả lời

2

bạn có thể sử dụng phương pháp OrderBy để phân loại

và cũng cố gắng này quá ..

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

để biết thêm thông tin chi phiếu dưới đây liên kết

http://msdn.microsoft.com/en-us/library/dd460719.aspx, bạn có thể nghiêng thế nào để làm phân loại phức tạp bằng cách sử dụng PLINQ, ví dụ:

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. 
+0

Nhưng các đối tượng vẫn còn trong bộ sưu tập đồng thời. Tôi có thể xóa các mục cũ nhất bằng cách nào? – Kim

0

Nhận một danh sách từ bộ sưu tập, sắp xếp danh sách, như:

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

Người đàn ông, đó là một cách đắt tiền để làm điều đó! – tzup

+1

Vâng tôi nghĩ vậy, tôi vừa thêm một giải pháp thay thế, bạn có nghĩ rằng điều này sẽ bị xóa? –

+0

Không thể xem giải pháp thay thế của bạn ngay cả sau khi làm mới trang. Dù sao, nó là vào bạn, nhưng tôi sẽ để lại câu trả lời này như là. Đừng nghĩ rằng nó sẽ bị bỏ phiếu xuống vì nó không phải là không hợp lệ. – tzup

5

Để mở rộng về câu trả lời DSW, bạn có thể sử dụng OrderBy trên đếm được.

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

Bạn cũng có thể làm điều đó trong thứ tự giảm dần:

customCollection.OrderByDescending(cc => cc.FieldToOrderBy); 
+0

bộ sưu tập có thể bị thay đổi bởi một chuỗi khác trong khi nó đang được sắp xếp không? Hoặc OrderBy có tạo danh sách mới –

+1

OrderBy chỉ cần sắp xếp một IEnumerable mới. Cấu trúc dữ liệu cơ bản không thay đổi. –