2012-06-01 55 views
2

我工作的一個項目,我需要跟蹤:使用什麼樣的數據結構?

  • 5-6只是一個字符串名稱的根項目
  • 每根項目需要有不同的標識符類型的多個兒童(INT,字符串,浮動等)。一個根的所有的孩子都將是相同的類型,但每一根都會有不同的孩子類型
  • 用戶需要能夠從每一根添加/刪除兒童
  • 我以後需要訪問每一個孩子,並執行字符串操作和需要時解析

我想過也許使用字典,其中密鑰是一個字符串,值是對象列表。或者爲每個根項目分配一個獨特的類,每個類將包含一個子項列表。

有沒有人有什麼好的建議?我對OOP還是比較陌生的,請耐心等待:)

謝謝!

+3

乍一看,一個詞典<字符串,列表>好像你在找什麼。 – CodeHxr

+0

你是否想要強制*給定根的所有孩子都是同一類型的?我正在努力尋找一種方法來做到這一點。如果你願意在沒有這種強制執行的情況下生活,那麼'Dictionary >'會起作用。 –

+0

給定根的孩子不一定是相同的類型,事實上,如果他們不是,那麼它可能會更好。所以對於元組,我將能夠動態地添加/刪除我想要的任何類型的項目? – jerbotron

回答

6
public interface IRoot {} 

public class RootItem<T> : IRoot 
{ 
    public string Name { get; set; } 
    public List<T> Children {get; set; } 
} 

然後保持一個Dictionary<string, IRoot>把他們全部。

Dictionary<string, IRoot> hair = new Dictionary<string, IRoot>(); 
hair.Add(
    new RootItem<int>() 
     { 
     Name = "None", 
     Children = new List<int>() {1, 2, 3, 4} 
     } 
); 

hair.Add(
    new RootItem<decimal>() 
     { 
     Name = "None", 
     Children = new List<decimal>() {1m, 2m, 3m, 4m} 
     } 
); 
+0

這很好。 – CodeHxr

+0

謝謝。爲了紀錄,@FishBasketGordo提供了更豐富的樣本。 – bluevector

+0

'Dictionary '是無效的,因爲沒有泛型參數的'RootItem'是一個不完整的類型。 – FishBasketGordo

0

聽起來像Dictionary<string, Tuple<type1, type 2, etc>>是一個很好的候選人。

關鍵將是字符串(根)。到根的孩子是一個元組。我們可以添加項目到元組。感謝您指出了這一點。

Good starting point on Tuple

+0

您無法在運行時從元組添加或刪除項目。 –

+0

@MichaelEdenfield感謝您指出這一點。糾正。 – Sandeep

+0

'Tuple '構造允許異構的'Dictionary'值,但是@swifferclean提到每個值都是一個任意列表,每個列表的項目都是相同的類型。它的值列表的類型需要改變。 – bluevector

2

如何用List<T>一個泛型類包含子:

public class Root<T> 
{ 
    private List<T> children = null; 

    public Root(string name) 
    { 
     Name = name; 
    } 

    public string Name { get; set; } 

    public List<T> Children 
    { 
     get 
     { 
      if (children == null) 
      { 
       children = new List<T>(); 
      } 

      return children; 
     } 
    } 
} 

Root<int> intRoot = new Root<int>("IntRoot"); 
intRoot.Children.Add(23); 
intRoot.Children.Add(42); 

Root<string> stringRoot = new Root<string>("StringRoot"); 
stringRoot.Children.Add("String1"); 
stringRoot.Children.Add("String2"); 
stringRoot.Children.Add("String3"); 
stringRoot.Children.Add("String4"); 

如果你想保存所有的根在一個對象,你可以寫自己的類或使用Tuple

var rootGroup = Tuple.Create(intRoot, stringRoot); 
// intRoot is accessible as rootGroup.Item1 
// stringRoot is accessible as rootGroup.Item2 
+0

這是我想出來的,但OP也想要一個'Dictionary ',我認爲這是不可能的;你可以有一個非泛型的'RootItem'類,但是在這個過程中你會失去一些類型的安全性...... –

+0

對於我缺乏編程知識感到抱歉! 所以當你聲明intRoot和stringRoot,在等號的右邊,你是否基本上調用Root(string name)函數?或..是您的類考慮到構造函數的根(字符串名稱)「東西」? – jerbotron

+0

這是一個構造函數。任何時候你看到'new'運算符,你都在處理一個構造函數。另外,你可以通過查看類本身來告訴它是一個構造函數,因爲它的名稱與類相同,並且沒有明確的返回類型。 – FishBasketGordo

0

下面介紹一種方法。有很多鑄造的需要發生,但它能夠完成任務:

static void Main(string[] args) 
    { 
     Dictionary<string, IRootCollection> values = new Dictionary<string, IRootCollection>(); 

     values["strings"] = new RootCollection<string>(); 
     (values["strings"] as RootCollection<string>).Add("foo"); 
     (values["strings"] as RootCollection<string>).Add("bar"); 

     values["ints"] = new RootCollection<int>(); 
     (values["ints"] as RootCollection<int>).Add(45); 
     (values["ints"] as RootCollection<int>).Add(86); 
    } 

    interface IRootCollection { } 
    class RootCollection<T> : List<T>, IRootCollection { } 
相關問題