C#多维数组、ArrayList还是哈希表?

5

我正在尝试构建一个多维“数组”,它具有以下特点:

  • 大小灵活
  • 使用2个键
  • 第一个键是整数(灵活)
  • 第二个键是字符串(有些受限)

使用方式如下:

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个回答

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]的语法是一个对象初始化器;下面的两个代码段大致等效:

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

变量列表=新的List<Person>(); list.Add(new Person());非常有趣如何添加值?list.Add(new Person(){ FirstName = "Joe", LastName = "Smith", Phone = "foo" });就像这样? - Data-Base

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>,而不是数组。


0

我认为你不能使用一个数组来完成这个任务,除非你有一个单一的KeyValuePair<int,string>数组,但我认为你真正想要的是一个Dictionary<int,string>。

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

}

哦,抱歉我没有注意到2个键的部分。 - Grokodile

0

实际上我只看到了两个维度。第一个是行索引,第二个是列索引。这听起来像是一个数据表


在这个例子中http://dotnetperls.com/datatable-foreach,如何显示项目标签{name,phone}而不是“item:”。祝好! - Data-Base

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接