2010-08-05 3 views
2

Я хочу иметь ArrayList, где он содержит HashTables. Я создаю Hashtable и добавленные значения. Затем я добавил его в ArrayList. Затем я изменил значения Hashtables и снова добавил список массивов. Он не сохраняет первые значения и заканчивает дублирование значений, которые были точно такими же, как и последние значения!ArrayList из Hashtables в C#

Любые предложения? Вот мой код

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. Вместо этого вы должны использовать List , если вы не используете .Net framework 1/1.1. Список даст лучшую производительность и избежит кастинга (что «foreach» подразумевает в вашем случае). привет –

+1

Вы не создаете новый экземпляр Hashtable, вместо этого вы переписываете значения. P.S.: Использование нескольких восклицательных знаков в теме не так полезно, если вы ожидаете ответа: p –

+0

Тем не менее, люди должны голосовать по этому вопросу, а не по грамматике. –

ответ

8

Переместите начало в свою основную функцию и повторно инициализируйте его для второго добавления (и, как @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

Я не уверен, это так, как я знаю, поэтому я могу сериализовать его позже :-) У вас есть пример, похожий на мой? что позволяет мне сериализовать его? –

+0

Да, в зависимости от того, как и почему вы сериализуете, вы просто отмечаете класс '[Serializable]' вверху. См. Пример здесь: http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx и здесь: http://msdn.microsoft.com/en-us/library/ms973893.aspx. –

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 для. Он сохраняет только ту же информацию (кроме «active») в свойстве 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

На самом деле это то, что я нашел сам себе :-) , но спасибо за предложение :-) это дает мне хороший толчок, что я на правильном пути, ура. –

Смежные вопросы