2016-04-14 1 views
0

この辞書を使用してオブジェクトのリスト(ツリー構造)をソートしようとしています。辞書の対応するIDに従ってオブジェクトリストをソート

Dictionary<Tuple<int, int>, int?> 

タプルには、固有のオブジェクトを識別する2つのIDが含まれています。値はソート順です。

オブジェクトは、私は上記辞書に従って

List<DmsSortOrder> 

をソートする必要

public class DmsSortOrder : IRecord 
{ 
    public int TagID { get; set; } 

    public int ObjectID { get; set; } 

    public int? Order { get; set; } 
} 

と同様の構造を有しています。

Dictionary<Tuple<tagID, objectID>, sortOrder>() 

辞書の値に従ってオブジェクトのリストをソートする必要がありますが、わかりません。それが重要であれば、リストは実際にリストのリストですが、ひとつのブランチをソートすることができれば、リスト全体をソートするために再帰を使用するのが快適です。

ご協力いただければ幸いです。私はこれを最適化する方法の多くが、一般的な考え方が確信している

var sortedList = list.OrderBy(obj => sortOrders[new Tuple(obj.Id1, obj.Id2)]).ToList(); 

List<UniqueObject> list; 
Dictionary<Tuple<int, int>, int?> sortOrders; 

あなたはこのようなもので終わる必要があります。これらの変数を考慮する

+0

は単に 'SortedDictionary'は、この問題を解決する使用しますか? –

+0

@ stephen.vakil私はそうは思わない..私の元の質問は不明か、それとも人々をあまりにも早くスキャンしているのだろうか? –

+0

クラスのIComparableを辞書で継承し、独自のCompareTo()メソッドを追加して並べ替えることができます。 – jdweng

答えて

0

は、私は、クエリのようにしたいと思います。

+0

私は言及を忘れてしまった。辞書には複数のリストの並べ替え順が含まれているため、辞書を並べ替えた後、リストから並べ替え順に要素を選択することはできません。私はまた、経験不足のためにLINQクエリを読むのに苦労しています。それはこれをしますか? –

+0

また、最初のselectステートメントで型推論エラーが発生します。 "型引数を明示的に指定してみてください" –

+0

私はこの疑問を台無しにしました。ソートにはリストも含まれている必要があります。それは木構造です。 –

0
List<MyObject> list; // MyObject has Id1, Id2 
Dictionary<Tuple<int, int>, int?> dict; 

var sortedObjects = 
    dict.OrderBy(kvp=>kvp.Value)) 
     .Select(kvp=> 
      list.Single(obj => 
       obj.Id1 == kvp.Key.Item1 
       && obj.Id2 == kvp.Key.Item2 
      ) 
     ); 
+0

私は辞書を並べ替えるつもりはありません。私はオブジェクトのリストをソートする必要があります。オブジェクトのIDは、ObjectIDタプルのディクショナリ内に含まれており、ソート順です。 –

+0

ここに行きます - 複合主キーと一緒に作成する2つのフィールドとソート順の値を持つタプル(複合主キー)を持つ辞書を持つMyObjectのリスト。 – Gerino

0

むしろ単純です。

lists = lists 
    .Select(list => list 
     .Select(x => new {Key = Tuple.Create(x.TagID, x.ObjectID), DmsSortOrder = x}) 
     .OrderBy(x => dict.ContainsKey(x.Key) ? dict[x.Key] : int.MaxValue) 
     .Select(x => x.DmsSortOrder) 
     .ToList()) 
    .ToList(); 

変更値int.MaxValueあなたが最後に、未知のオブジェクトを表示したくない場合は:

+0

多くの不要なタプルを作成します。あまりにも多くの無駄なバイトは、アポロ時代のロケットでは使用しません;) – Gerino

+0

ええ、私はそれを否定しません。コンテキストなしですぐに最適化する必要性を感じないでください。多分、私たちは約100の物体を話しているのでしょうか? ;) –

0

あなたはそれがこれをやってくださいすることができ、辞書の値に従ってリストをソートしたい場合:

List<DmsSortOrder> list = ... 
Dictionary<Tuple<int, int>, int> sortOrder = ... 

list.Sort((x, y) => sortOrder[Tuple.Create(x.TagID, x.ObjectID)] - 
        sortOrder[Tuple.Create(y.TagID, y.ObjectID)]); 
//or 
list = list.OrderBy(o => sortOrder[Tuple.Create(o.TagID, o.ObjectID)]).ToList(); 
関連する問題