2011-08-09 12 views
5

.NET 4.0で並行コレクションをソートする方法 たとえば、ConcurrentBagコレクションを構築しました。どのようにして要素をソートできますか?.NET 4.0で並行コレクションをソートする方法

ConcurrentBag<string> stringCollection; 

ConcurrentBag<CustomType> customCollection; 
+2

はあなたを行いますある時点ですべての要素を含む新しいソートされたコレクションが必要な場合、またはその順序でソートされたり、ソートされたりしたい場合などです。 – alun

+0

メソッドを使用してソートしたいのですが、ソートを行うためにLINQを使用する必要があります。 –

答えて

2

あなたがリンク

http://msdn.microsoft.com/en-us/library/dd460719.aspx以下のより多くの情報のチェックに

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

..

をソートするためOrderByメソッドを使用して、あまりにもこれを試すことができ、あなたは何をするかに傾くことができます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. 
+0

ただし、オブジェクトはコンカレント・コレクションに残ります。最も古いアイテムを削除するにはどうすればよいですか? – Kim

0

は次のように、リストを並べ替え、コレクションからリストを取得します:DSWの答えに展開する

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

男、それはそれを行う高価な方法です! – tzup

+1

はい、私はそう思う、代わりのソリューションを追加しました。あなたはこれを削除すべきだと思いますか? –

+0

ページを更新した後も代替ソリューションが表示されません。とにかく、それはあなた次第ですが、私はこの答えをそのまま残します。それが無効ではないので、投票されるとは思わないでください。 – tzup

5

、あなたが列挙上のOrderByを使用することができます。

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

また降順でそれを行うことができます。

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

ソート中に別のスレッドによってコレクションが変更される可能性がありますか?またはOrderByは新しいリストを作成します –

+1

OrderByはただ新しいIEnumerableをソートします。基本となるデータ構造は変更されません。 –

関連する問題