2010-12-30 30 views
5

ile hiyerarşik sınıf yapısı Dolum:Böyle bir hiyerarşik sınıf yapısı var verilerle

Kategori -> Şablon -> Örnek

bir kategori birden şablonları içeren bir şablon birden çok örneği içeriyor.

CategoryID | CategoryName | CategoryType | TemplateID | TemplateName | TemplateXYZ | InstanceID | InstanceName 
1 | "CatA" | "TypeX" | 1 | "TempA" | "X" | 1 | "InstA" 
1 | "CatA" | "TypeX" | 1 | "TempA" | "X" | 2 | "InstB" 
1 | "CatA" | "TypeX" | 1 | "TempA" | "X" | 3 | "InstC" 
1 | "CatA" | "TypeX" | 1 | "TempB" | "Y" | 4 | "InstD" 

(sadece bir örnek, gerçek veri tabloları çok daha fazla sütuna sahip)

: Ben her 3 tablolar üzerinde katılmak yoluyla veritabanından veri sorgulamak durumunda

, veri şuna benzer

Bir veri okuyucusu ile dolaşırken bu tür verilerle sınıfları doldurmak için C# 'daki en iyi/ortak yol hangisidir?

while(data.Read()) 
{ 
    // Create new objects each time the ID changes and read the data from the first row 
    if(data["CategoryID"] != lastCategoryID) { 
    lastCategoryID = data["CategoryID"]; 
    cat = new Category(data["CategoryName"], data["CategoryType"]); 
    catList.Add(cat); 
    } 
    if(data["TemplateID"] != lastTemplateID) { 
    lastTempateID = data["TemplateID"]; 
    template = new Template(data["TemplateName"], data["TemplateXYZ"])); 
    cat.Templates.Add(template); 
    } 
    template.Instances.Add(new Instance(data["InstanceID"], data["InstanceName"]); 
} 

hiyerarşik sınıf nesneleri doldurmak için daha iyi, daha zarif bir çözüm var mı: ben bu şekilde yapardı başımın tepesinden

? Belki LINQ veya Sözlükler kullanarak?

Not: Bu soru, best way to gather hierarchical data from a DB hakkında başka bir soruyla ilgili. Ayrılıyorum çünkü bu iki ayrı konu.

cevap

3

Ne yaparsanız onu çalışmak için iyi bir yol gibi görünüyor. Sorgunuzdaki verileri ve sahip olduğunuz ID sütunlarını sıraladığınızdan emin olun. Kategoriye göre sırala şablon. Bu, bu kimliklerden birine geri dönüp tekrar nesne oluşturmamanızı sağlayacaktır.

Ayrıca - bir şablon birden çok kategoride olabilirse, kategorilerin çoğunu çoğaltmadığınızdan emin olmak için her şablonu bir listede bir yere kaydetmeniz gerekir. aşağıdaki gibi

+0

Teşekkür Bunu belirtmek için, bir şablon gerçekten birden fazla kategoride olabilir. Yine de, sadece birinciden birçok sıraya eşit olan veriyi almaktan mutsuz olmama rağmen, daha iyi bir öneri yoksa, bunu bu şekilde uygulayacağım sanırım. – magnattic

-1

şey sınıfı yaklaşım doğrudan sağlamak olacaktır:

veri okuyucudan okunan olarak
string[] allLines = File.ReadAllLines("datafile.dat"); 

var query = from line in allLines 
      let data = line.Split('|') 
      select Category 
       { 
        CategoryID = data[0], 
        CategoryName = data[1], 
        CategoryType = data[2], 
        Template = new Template { TemplateID = data[3], 
               TemplateXYZ = data[4], 
               Instance = new Instance { InstanceID = data[5], 
        InstanceName = data[6] } 
            } 
       }; 
+3

Suçlama yok, ama soruyu okudun mu? Verileri bir veritabanından sorgularım ve cevabınızın hiyerarşik veri yapısıyla ilgili bir şeyleri bile yoktur. – magnattic

+0

Evet okudum ve bu yüzden size yapınızı alan ve bir nesneye yerleştiren bir çözüm verdim. Kategoriler nesnesinin aksine yeni koydum. Sonra, şablon ve örnek nesnelerini istediğiniz gibi hiyerarşiye verecek şekilde satır içi olarak da oluşturabileceğinizi biliyordunuz. – phillip

+0

Artık bir hiyerarşi içinde görebilmeniz için yayınlamayı güncelledim.Genelde bu tür bir kodu yazdığımda, hepsini bu gibi sıraya koymayım - genellikle onları ayrı ayrı yaratır ve sonra çocuk nesnelerini ebeveynlerine yerleştiririm ama bu sadece bir tercihtir. – phillip

1

, her satır verileri içeren bir nesne doldurun. Bu noktada kopyalarla ilgili endişelenmeyin:

var rawData = new List<Incoming>(); 
while (data.Read()) 
{ 
    rawData.Add(new Incoming(data[0], data[1],data[2],data[3],data[4],data[5],data[6],data[7])); 
} 

public class Incoming 
{ 
    public int CategoryID { get; set; } 
    public string CategoryName { get; set; } 
    public int CategoryType { get; set; } 
    public int TemplateID { get; set; } 
    public string TemplateName { get; set; } 
    public int TemplateXYZ { get; set; } 
    public int InstanceID { get; set; } 
    public string InstanceName { get; set; } 

    public Incoming(int categoryID , string categoryName , int categoryType , int templateId,string templateName ,int templateXYZ , int instanceID , string instanceName ) 
    { 
     CategoryID =categoryID; 
     CategoryName = categoryName; CategoryType = categoryType; TemplateID = templateId; 
     TemplateName = templateName; TemplateXYZ = templateXYZ; InstanceID = instanceID; InstanceName = instanceName; 
    } 
} 

o zaman hiyerarşi bireysel düzeylerde çıkmak için LINQ kullanabilirsiniz burada:

var categories = rawData.GroupBy (d => d.CategoryID );