C#多维数组,ArrayList或哈希表?

时间:2010-05-04 08:47:35

标签: c# arrays multidimensional-array arraylist hashtable

我正在试图弄清楚如何构建一个多维“数组”:

  • 灵活的尺寸
  • 使用2把钥匙
  • 第一个键是int(灵活)
  • 第二个键是字符串(种类有限)

用法如下:

console.writelen(array[0]["firstname"]);
console.writelen(array[0]["lastname"]);
console.writelen(array[0]["phone"]);

console.writelen(array[1]["firstname"]);
console.writelen(array[1]["lastname"]);
console.writelen(array[1]["phone"]);

.....
.....

console.writelen(array[x]["firstname"]);
console.writelen(array[x]["lastname"]);
console.writelen(array[x]["phone"]);

4 个答案:

答案 0 :(得分:11)

您确定创建一个包含数据的类/结构更合适吗?例如:

class Person
{
    public string FirstName
    {
        get;
        set;
    }

    public string LastName
    {
        get;
        set;
    }

    public string Phone
    {
        get;
        set;
    }
}

然后你只需要创建一个Person

的数组
var array = new Person[1];
array[0] = new Person() { FirstName = "Joe", LastName = "Smith", Phone = "foo" };

或者,既然你说“灵活的大小”,也许你想要一个列表:

var list = new List<Person>();
list.Add(new Person());

更新:第一个示例中用于设置array[0]的语法是object initializer;以下两个片段大致相同:

var foo = new Person();
foo.FirstName = "John";

var bar = new Person() { FirstName = "John" };

是的,如果你愿意的话,你可以打电话给list.Add(new Person() { ... })。在这种情况下,您还可以使用集合初始值设定项:

var john = new Person() { FirstName = "John" };
var joe = new Person() { FirstName = "Joe" };
var list = new List<Person>() { john, joe };

答案 1 :(得分:4)

你可以简单地使用它:

Dictionary<int, Dictionary<string, string>>

像这样使用:

var dd = new Dictionary<int, Dictionary<string, string>>();
dd[5] = new Dictionary<string, string>();
dd[5]["a"] = "foo";

您还可以创建一个新类来简化内部字典的创建:

class DDict { // optional: generic
    private readonly Dictionary<int, Dictionary<string, string>> _Inner = new ...;

    public Dictionary<string, string> this (int index) {
        Dictionary<string, string> d;
        if (!_Inner.TryGetValue(index, out d)) {
             d = new Dictionary<string, string>();
             _Inner.Add(index, d);
        }
        return d;
    }
}

var dd = new DDict();
dd[5]["a"] = "hi";

如果第一个索引是顺序的,你当然也可以只使用一个字典数组:

var dd = new Dictionary<string, string>[128];

另外,如果内部成员总是相同的,我建议创建一个新类并在数组中访问它:

class Dat {
    string name;
    string phone;
}
var list = new Dat[128]

// access:
list[5].name = "matt";

在这种情况下,您也可以使用ListDictionary<int, Dat>来代替数组。

答案 2 :(得分:0)

我不相信你可以用数组做这个,除非你有一个KeyValuePair&lt; int,string&gt;数组,但我认为你真的想要一个Dictionary&lt; int,string&gt ;.

var dic = new Dictionary<int,string>();
dic[0] = "zero";
dic[1] = "one";
dic[2] = "two";

foreach(KeyValuePair<int,string> kvp in dic)
{
   Console.WriteLine(String.Format("Key: {0}, Value: {1}",kvp.Key,kvp.Value);

}

答案 3 :(得分:0)

实际上我只看到两个维度。第一个是行索引,第二个是列索引。这对我来说听起来像DataTable