2012-12-19 17 views
12

Bir depo arabirimini uygulayan iki farklı modelde iki veri koleksiyonum var. Bunlardan biri Deposu modeliyle mükemmel uyum sağlayan düz bir listede. Diğer veri modeli bir ağaç yapısında biçimlendirilmiştir ve inşa ettiğim depo arayüzünün uygulanması çok gölgeli görünüyor. İkinci veri modelini düzleştirmeye çalışabilirim ve sadece ebeveynlere referansları kullanabilirim ancak şu anda uygulamanın bir ağaç yapısı olarak veri elde etmekten büyük faydaları vardır.Bir ağaç yapısında veri modeliyle depo düzeni uygulaması

Ağaç yapılandırılmış bir veri modeliyle bir havuz kalıbı uygulama deneyiminin olup olmadığını öğrenmek istiyorum. Şu anda benim Get(Func<T, bool> predicate) yönteminde yinelemeli bir yöntemle listeyi düzleştiriyorum ve nesneyi bir LINQ sorgusuyla döndürüyorum ama bu uygulamanın biraz pahalıya mal olacağını düşünüyorum. Uygulamanın nasıl gerçekleştirileceğine dair ipuçları takdir edilecektir.

Burada, uygulamanın sillinesini göstermeye yardımcı olması durumunda, yüklem yöntemine göre uygulanması.

protected virtual IEnumerable<T> Get(Func<T, bool> predicate) 
{ 
    var objects = GetAll<T>(); 
    return objects.Where(predicate); 
} 

DÜZENLEME: biraz daha kod

private IEnumerable<TreeData> GetRecursiveObjects(TreeData object) 
    { 
     var allChildren = new List<TreeData>(); 
     allChildren.AddRange(object.Children); 

     foreach (var child in object.Children) 
     { 
      allChildren.AddRange(GetRecursiveObjects(child).ToArray()); 
     } 
     return allChildren; 
    } 

    protected virtual IEnumerable<T> GetAll<T>() 
    { 
     var objects = new List<T>(); 
     objects.AddRange(Objects); 
     foreach (var object in Objects) 
     { 
      objects.AddRange(GetRecursiveObjects(object)); 
     } 
     return objects.OfType<T>(); 
    } 

İkinci düzenleme:

Ben de havuzuna elemanları eklemek için iyi bir strateji olacağını hakkında biraz karışık. Kullanım kodundaki ana öğenin alt öğelerine ekleme işlemlerini yapmalı mıyım, yoksa havuzun hem öğeyi hem de bir üst öğeyi alıp tüm ekleme işlemini ele alması gerekir mi?

tl; dr

bir ağaç yapısında verilerle bir depo arayüzünü uygulamayı deneme deli midir?

+1

Sorunuzun yanıtı, gerçekten ağacınızın yapısına ve verilerinizi nasıl aradığınıza bağlı olarak değişir. Biraz daha detay verebilir misiniz? – James

+0

GetAll yöntemi, çocukları yinelemeli olarak gider ve bunları bir listeye ekler. – Moriya

+0

Sadece merakım için: Neden yapıyı düzleştirmede ısrar ediyorsun? Neden depo ağaca benzeyen bir yapıya geri dönmemeli? –

cevap

4

Ağacı gezen ve bir yineleme bloğu (yield return) kullanarak bir IEnumerable<T> döndüren bir yöntem yazabilirsiniz.

Sonra senin senin ağacının içeriğini "düz" bir koleksiyon oluşturmak olmazdı ve sen sadece yüklemi uygulamak için LINQ nesnelere kullanabilirsiniz:

Aslında
protected virtual IEnumerable<T> Get(Func<T, bool> predicate) 
{ 
    return WalkAll().Where(predicate); 
} 

, LINQ sorgu olsam Müşteri kodu bunu numaralandırıncaya kadar değerlendirilemez.

İlgili konular