我想要一个包含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();
}
}
}
答案 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
:所以您的代码所做的是:填充哈希表,将其引用添加到列表中,再修改一下,再次添加相同的参考。
想补充一下,你为什么要使用哈希表?使用您想要的字段的新课程会好得多 - 然后他们可以使用PrintInfo
或ToString
覆盖来获取您需要的信息 - 可能是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();
}