ArrayList Hashtables в C # - PullRequest
       14

ArrayList Hashtables в C #

2 голосов
/ 05 августа 2010

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

Есть предложения? Вот мой код

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();   
        }
    }
}

Ответы [ 3 ]

8 голосов
/ 05 августа 2010

Переместите начало внутрь функции 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 голосов
/ 05 августа 2010

Вы изменяете один и только Start Hashtable объект, вы должны создать новый:

Start = new Hashtable();

сразу после первого:

StartList.Add(Start);

Помните, вы только добавляете ссылку к объекту к ArrayList: так чтокод делает: заполнить хеш-таблицу, добавить ссылку на нее в список, еще немного изменить ее и снова добавить эту же ссылку.


Хотите добавить, почему вы используете хеш-таблицу?Было бы намного лучше использовать новый класс с полями, которые вы хотите - тогда они могли бы иметь PrintInfo или ToString переопределение, которое получает необходимую вам информацию - и, вероятно, Execute метод.

1 голос
/ 05 августа 2010

Еще несколько отзывов об этом: хотя Nix уже ответил на ваш вопрос, я бы также отбросил 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();   
    }
...