2010-08-05 118 views
2

我想有一個ArrayList它包含HashTables。我創建了一個Hashtable並添加了值。然後我將它添加到ArrayList。然後我改變了哈希表的值,並再次添加了數組列表。它不會保存第一個值並結束與上一個值完全相同的重複值!C#中的哈希表ArrayList#

有什麼建議嗎?這裏是我的代碼

namespace ValuesTest 
{ 
    internal class Class1 
    {  
     public static ArrayList StartList = new ArrayList(); 
     public static Hashtable Start = new Hashtable();  

     static void Main(string[] args) 
     {  
      Start["active"] = true; 
      Start["name"] = "prog1"; 
      Start["path"] = @"C:\programfiles\prog1"; 
      Start["parameter"] = string.Empty; 

      StartList.Add(Start); 

      Start["active"] = false; 
      Start["name"] = "prog2"; 
      Start["path"] = @"C:\programfiles\prog2"; 
      Start["parameter"] = "/q"; 

      StartList.Add(Start); 

      foreach (Hashtable HT in StartList) 
      { 
       Console.WriteLine(HT["active"] + " - " + HT["name"] + " - " + HT["path"] + " - " + HT["parameter"]); 
       // it will always gives 
       // False - prog2 - C:\programfiles\prog2 - /q  
      } 

      Console.ReadLine(); 
     } 
    } 
} 
+5

我所看到的最近有很多ArrayList的。相反,除非您使用.Net框架1/1.1,否則應該使用列表。列表將提供更好的性能並避免投射(這種'foreach'確實隱含在您的案例中)。問候 – 2010-08-05 12:21:16

+1

您不會創建一個新的Hashtable實例,而是覆蓋這些值。 P.S.:如果您期待答案,在主題中使用多個感嘆號並不會有幫助:p – 2010-08-05 12:21:33

+0

但是,人們應該對問題投票,而不是語法。 – 2010-08-05 12:28:54

回答

8

將開始移動到您的Main函數中,並重新初始化它以進行第二次添加(並且@lasseespeholt表示使用List<T>)。

static List<Hashtable> StartList = new List<Hashtable>(); 

    static void Main(string[] args) 
    { 
     Hashtable Start = new Hashtable(); 
     Start["active"] = true; 
     Start["name"] = "prog1"; 
     Start["path"] = @"C:\programfiles\prog1"; 
     Start["parameter"] = string.Empty; 

     StartList.Add(Start); 

     Start = new Hashtable(); 
     Start["active"] = false; 
     Start["name"] = "prog2"; 
     Start["path"] = @"C:\programfiles\prog2"; 
     Start["parameter"] = "/q"; 

     StartList.Add(Start); 
6

你修改唯一StartHashtable對象,你必須創建一個新的:

Start = new Hashtable();

之後第一:

StartList.Add(Start);

請記住,您只是將參考添加到對象到ArrayList:因此,您的代碼執行的操作是:填充散列表,將其引用添加到列表中,再修改它,然後添加相同的引用再次。


想添加,爲什麼你使用散列表?如果你想使用一個新的課程,那麼他們可以有一個PrintInfo,或者一個ToString覆蓋來獲取你需要的信息 - 大概是一個Execute方法。

+1

我不確定,這是我知道的方式,所以我可以稍後序列化:-) 你有沒有類似於我的例子?這使我能夠序列化它? – 2010-08-05 12:42:47

+0

是的,取決於你如何以及爲什麼要序列化,你只需在頂部用'[Serializable]'標記該類。請參閱此處的示例:http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx並在此處指導:http://msdn.microsoft.com/en-us/library/ms973893.aspx。 – 2010-08-05 12:50:55

1

一些這方面的更多反饋:儘管尼克斯已經回答了你的問題,我就把你的Hashtable以及(就如同ArrayList的它的日),雖然你的概念不借給自己漂亮吧:你存儲串反對..

所以,複製和改變,我們會最終

static void Main(string[] args) 
{ 
     Dictionary<string, object> Start = new Dictionary<string, object>(); 
     Start["active"] = true; 
     Start["name"] = "prog1"; 
     Start["path"] = @"C:\programfiles\prog1"; 
     Start["parameter"] = string.Empty; 

     StartList.Add(Start); 

     Dictionary<string, object> Start = new Dictionary<string, object>(); 
     Start["active"] = false; 
     Start["name"] = "prog2"; 
     Start["path"] = @"C:\programfiles\prog2"; 
     Start["parameter"] = "/q"; 

     StartList.Add(Start); 

但我會走的更遠:如果你只是想創建子進程,這就是類Process是。它只保留StartInfo屬性中的相同信息(「有效」除外)。

另外,(?更好)的方法是創建一個值類這組信息:

class YourStartInfo 
{ 
    public bool Active { get; set; } 
    public string Name { get; set; } 
    public string Path { get; set; } 
    public string Parameter { get; set; } 
} 

,改變你的代碼使用的是:

static List<YourStartInfo> StartList = new List<YourStartInfo>(); 

static void Main(string[] args) 
{  
     StartList.Add(new YourStartInfo { 
      Active = true, 
      Name = "prog1", 
      Path = @"C:\programfiles\prog1"; 
      Parameter = string.Empty 
     }); 

     StartList.Add(new YourStartInfo { 
      Active = false, 
      Name = "prog2", 
      Path = @"C:\programfiles\prog2"; 
      Parameter = "/q" 
     }); 

     foreach (YourStartInfo startInfo in StartList) 
     { 
      // Access the information in a sane way, not as object here 
      if (startInfo.Active) 
      { 
       // Probably launch it? 
      } 
     } 

     Console.ReadLine(); 
    } 
+0

其實,我發現我自己現在在做:-) 但感謝您的建議:-) 它給了我一個很好的推動,我在正確的道路上, 歡呼聲。 – 2010-08-05 14:52:40