2016-04-14 51 views
0

'daki karşılık gelen kimliklerine göre Sıralama Bu Sözlük kullanılarak bir Nesne Listesi (Ağaç yapısı) sıralamaya çalışıyorum;Bir sözlük listesi, bir sözlük

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

Tuple, benzersiz bir nesneyi tanımlayan iki kimlik içerir. Değer sıralama düzenidir.

amacı yukarıda Dictionary göre bir

List<DmsSortOrder> 

sıralamak için gereken

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

    public int ObjectID { get; set; } 

    public int? Order { get; set; } 
} 

benzer bir yapıya sahiptir.

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

Nesnelerin listesini sözlükteki değerlere göre sıralamalıyım, ancak emin değilim. Eğer önemliyse, liste aslında bir liste listesidir, ancak tek bir dalı sıralayabildiğimde bütün Listeyi sıralamak için özyinelemede rahat hissediyorum.

Her türlü yardım takdir edilecektir.

+0

basitçe 'SortedDictionary' bu sorunu çözmek kullanarak misiniz? –

+0

@ stephen.vakil Ben öyle düşünmüyorum .. Özgün sorumu belirsiz mi, yoksa insanlar çok hızlı mı taranıyor? –

+0

Sınıfta IComparable'ı sözlüğüyle devralabilir ve ardından sıralama için size kendi özel CompareTo() yöntemini ekleyebilirsiniz. – jdweng

cevap

0

Sana bir sorgu böyle istiyor sanırım.

+0

Söylemeyi unuttum; sözlük, birden çok liste için sıralama emirleri içerir, bu yüzden sözlüğü basitçe sıralayamıyorum ve sonra Listeden sıralanmış sırayla öğeleri seçemiyorum. Ayrıca deneyimsizliğinden dolayı LINQ sorgunuzu okumak için uğraşıyorum. Bunu yapar mı? –

+0

Ayrıca, ilk seçim ifadesinde bir tür çıkarım hatası alıyorum. "Tür argümanlarını açıkça belirtmeyi deneyin" –

+0

Bu soruyu berbat ettim. Listenin kendi listelerini içerdiği gibi, sıralama da yapılmalıdır. Bir ağaç yapısıdır. –

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

Sözlük'ü sıralamaya çalışmıyorum. Nesnelerin ID'lerinin bir ObjectID tuples Sözlüğünde ve sıralama düzeninde yer aldığı bir Nesne Listesi'ni sıralamalıyım. –

+0

İşte işte - Kompozit bir birincil anahtarı bir araya getiren iki alana sahip bir MyObject listesi ve sıralama düzeni olarak bir tuple (birleşik birincil anahtar) içeren bir sözlük. – Gerino

0

Verilen bu değişkenler:

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

eminim pek çok yolu bu orada optimize etmek, ancak genel bir fikir:

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

Böyle bir şey ile bitirmek gerekir oldukça basittir.

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

Değiştir değeri int.MaxValue Sonunda bilinmeyen nesneleri görmek için istemiyorsanız:

+0

Çok fazla gereksiz Tupl yaratıyorsunuz!Çok fazla boşa harcanan bayt, Apollo dönemi uzay roketinde kullanılmaz;) – Gerino

+0

Evet, inkar etmiyorum. İçeriği olmadan hemen optimize etme ihtiyacını hissetmeyin. Belki yaklaşık 100 nesneden bahsediyoruz? ;) –

0

sen yapabileceğiniz sözlükte değerler bu yapıyor göre sıralamak isterseniz:

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