C#中的Hashtables的ArrayList

时间:2010-08-05 12:17:11

标签: c# arraylist hashtable

我想要一个包含HashTables的ArrayList。我创建了一个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 个答案:

答案 0 :(得分: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);

答案 1 :(得分:6)

您正在修改 唯一 Start Hashtable对象,您必须创建一个新对象:

Start = new Hashtable();

在第一个之后:

StartList.Add(Start);

请记住,您只是将引用添加到对象ArrayList:所以您的代码所做的是:填充哈希表,将其引用添加到列表中,再修改一下,再次添加相同的参考。


想补充一下,你为什么要使用哈希表?使用您想要的字段的新课程会好得多 - 然后他们可以使用PrintInfoToString覆盖来获取您需要的信息 - 可能是Execute方法

答案 2 :(得分:1)

关于这个问题的更多反馈:尽管Nix已经回答了你的问题,但我也会删除Hashtable(就像它的日期一样),虽然你的概念不适合它:你将字符串存储到对象..

因此,复制和更改我们最终会以

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