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

Posted

技术标签:

【中文标题】C#多维数组,ArrayList,还是哈希表?【英文标题】:C# multi-dimensional array, ArrayList, or hash table? 【发布时间】:2011-02-15 08:59:04 【问题描述】:

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

灵活的尺寸 使用 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"]);

【问题讨论】:

【参考方案1】:

除非你有一个 KeyValuePair 数组,否则我不相信你可以用数组来做到这一点,但我认为你真的想要一个 Dictionary

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 键部分。【参考方案2】:

你可以简单地使用这个:

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&lt;int, Dat&gt; 来代替数组。

【讨论】:

【参考方案3】:

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

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;以下两个sn-ps大致等价:

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 ;

【讨论】:

var list = new List(); list.Add(new Person());很有趣如何添加值? list.Add(new Person() FirstName = "Joe", LastName = "Smith", Phone = "foo" );像这样?【参考方案4】:

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

【讨论】:

在这个例子中dotnetperls.com/datatable-foreach如何显示项目标签name,phone而不是“item:”干杯

以上是关于C#多维数组,ArrayList,还是哈希表?的主要内容,如果未能解决你的问题,请参考以下文章

在 Powershell 中创建多维哈希表数组

如何将哈希表添加到多维数组?无法通过成员枚举赋值

C#中数组与ArrayList的简单使用

C# 从数据库表中填充多维数组

为啥 ArrayLists 的 ArrayList 不是多维的?

多维 Arraylist 配对