【问题标题】:C# multi-dimensional array, ArrayList, or hash table?C#多维数组,ArrayList,还是哈希表?
【发布时间】: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"]);

【问题讨论】:

    标签: c# arrays multidimensional-array arraylist hashtable


    【解决方案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

      【讨论】:

      猜你喜欢
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 2011-03-25
      • 2019-06-01
      • 2015-01-17
      • 1970-01-01
      • 2010-10-15
      相关资源
      最近更新 更多