2011-08-09 19 views
5

Cómo ordenar una colección concurrente en .NET 4.0 Por ejemplo, he construido mi colección ConcurrentBag. ¿Cómo puedo ordenar los elementos?Cómo ordenar una colección simultánea en .NET 4.0

ConcurrentBag<string> stringCollection; 

ConcurrentBag<CustomType> customCollection; 
+2

¿Te ¿Quiere decir que quiere una nueva colección ordenada con todos los elementos en algún momento o desea que se ordene todo el tiempo y extraer de ella en ese orden o algo por el estilo? – alun

+0

Quería ordenarlo usando un método pero no hay ninguno, así que tengo que usar LINQ para hacer la clasificación. –

Respuesta

2

puede utilizar OrderBy método para clasificar

y también tratar esto también ..

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

para más información comprueban debajo de acoplamiento

http://msdn.microsoft.com/en-us/library/dd460719.aspx, puede inclinarse cómo hacerlo clasificación compleja usando PLINQ, por ejemplo:

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

Pero los objetos permanecen en la colección concurrente. ¿Cómo puedo eliminar los artículos más antiguos? – Kim

0

Obtenga una lista de la colección, ordenar la lista, como:

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

¡Hombre, esa es una forma costosa de hacerlo! – tzup

+1

Sí, creo que sí, acabo de agregar una solución alternativa, ¿cree que debería eliminarse? –

+0

No se puede ver su solución alternativa incluso después de actualizar la página. De todos modos, depende de usted, pero dejaría esta respuesta como está. No pienses que se votará en contra porque no es válido. – tzup

5

Para ampliar la respuesta de DSW, se puede utilizar el OrdenarPor en una enumerable.

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

También puede hacerlo en orden descendente:

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

¿Puede la colección ser alterada por otro hilo mientras se está ordenando? ¿O OrderBy crea una nueva lista –

+1

OrderBy simplemente ordena un nuevo IEnumerable. La estructura de datos subyacente no cambia. –

Cuestiones relacionadas