2012-11-02 26 views
5

Ben iki SortedLists birleştiren bir kod parçası hızlandırmak için arıyorum. jenerik SortedListC# İki SortedLists (Birleştirme?)

C# 4.0: Bir sendika yerine foreach döngü daha hızlı olacağını düşünüyorum ama SortedList bir birliğe nasıl uygulanacağı bilmiyorum http://msdn.microsoft.com/en-us/library/ms132319(v=vs.100).aspx

public Trait getTrait(decimal thisValue) 
{  
    if (ParentStructure != null && ParentStructure.RankedTraits.Count > 0) 
    { 
     SortedList<decimal, Trait> tempTraits = this.RankedTraits; 

     // Improve here (union?) 
     foreach (KeyValuePair<decimal, Trait> kvp in (ParentStructure.RankedTraits)) 
     { 
      if (!tempTraits.ContainsKey(kvp.Key)) 
      { 
       tempTraits.Add(kvp.Key, kvp.Value); 
      } 
     } 
     return _getTrait(tempTraits, thisValue); 
     } 
    } 
    return _getTrait(_rankTraits, thisValue); 
} 

. Birisi bana yardımcı olabilirdi, ben bunu takdir ediyorum.

Ayrıca, genel olarak bunu yapmanın daha iyi bir yolu varsa, önerilere açığım.

+1

Sadece bir fikir, ancak [bu yanıt] 'a göre (http://stackoverflow.com/a/1754080/551322), girdi koleksiyonunu sıralamanız yardımcı olabilir. – nrodic

+0

Teşekkürler, girilen veriler sıralı listelerden geliyor, bu yüzden sıralı hale getirilmeli - SortedDictionary'a geçmek isteyebileceğime bakıyorum. –

+0

Neden bu kodu hızlandırmak istiyorsunuz? Kötü performans gösteriyor mu? – Enigmativity

cevap

2

İki SortedList örneğini birleştirmeyi düşünebilmemin tek yolu, onları birleştirmek, sonra da bir aramaya dönüştürmek, sonra da bir sözlük oluşturmak için arama koleksiyonunun ilk öğesini yakalar.

SortedList yalnızca birer birer eklediğinden dolayı bir sözlük yapmam gerekiyor. Yani diğer tek seçenek, SortedList yapıcısına bir sözlük enjekte etmektir.

Alt satır: Mevcut kodunuzun olduğu kadar güzel olduğunu düşünüyorum. LINQ, kodun yaklaşık 2 satıra indirilmesine yardımcı olabilir (ya da bir mazoşistiyseniz).

SortedList<decimal, Traits> listA = new SortedList<decimal, Traits>(); 
SortedList<decimal, Traits> listB = new SortedList<decimal, Traits>(); 

listA.Add(1m, new Traits { FieldName = "One" }); 
listA.Add(2m, new Traits { FieldName = "Two" }); 
listA.Add(3m, new Traits { FieldName = "Three" }); 

listB.Add(1m, new Traits { FieldName = "One" }); 
listB.Add(4m, new Traits { FieldName = "Four" }); 
listB.Add(5m, new Traits { FieldName = "Five" }); 

var listUnion = listA.Union(listB).ToLookup(k => k.Key, v => v.Value) 
        .ToDictionary(k => k.Key, v => v.First()); 
var listMerged = new SortedList<decimal, Traits>(listUnion); 
+0

Teşekkürler - bu, sendikalar hakkındaki sorularımı yanıtlıyor - ancak kodumu daha hızlı yapmıyor (muhtemelen bir SortedList'e dönüştürmek zorunda kaldığı için). Tekrar teşekkürler! –

+0

Evet, ben de öyle düşündüm. Sorun, "SortedList.Union", "IEqualityComparer" ile uyumlu görünmüyor.Eğer yapmış olsaydı, ** daha küçük bir performans sergileyebilirdi, çünkü arama dönüşümü daha sonradan sözlüğe dönüştürebilirdi. Aynı zamanda, "SortedList" in her seferinde bir kereden ziyade bir dizi "KeyValuePairs" in eklenmesini desteklemediği de berbattır. – code4life

+0

Evet, bu aslında orijinal koddan çok daha fazla döngü yapıyor, çünkü arka planda linq var. – theMayer

1

SortedSet, sorduğunuz şeyi yapan bir UnionWith yöntemine sahiptir. Kendi SortedSet uygulamamı oluşturdum ve çok hızlı bir şekilde çalışıyor.

http://msdn.microsoft.com/en-us/library/dd411939.aspx

Boşverin, tekrar okumak Sorunuzu ve liste uygulamasını kullanırken; Ancak, belirli bir anahtarı kullanmak yerine bir EqualityComparer oluşturmanın bir yolunu bulabilirseniz, bir SortedSet'i amacınıza uyarlamak mümkün olabilir.

+0

Teşekkürler, ancak SortedSet & SortedList aynı şey değildir. Beni şaşırtan anahtar/değer ve SortedSet'in anahtarı yok. - Ayrıca, nasıl uygulanacağına dair bir örnek vermeyi umuyorum. Kendi başıma arama yapabilirim. –

+0

Gerçekten, özür dilerim. Ancak, örnek kodunuza bakarak, kopyaları ortadan kaldırmaya mı çalışıyorsunuz? – theMayer

+0

Yinelenen anahtar yok - SortedList'in yinelenen anahtarlara sahip olabileceğine inanmıyorum. Yinelenen Değerler iyi. –

İlgili konular