C # многомерный массив, ArrayList или хеш-таблица? - PullRequest
5 голосов
/ 04 мая 2010

Я пытаюсь выяснить, как построить многомерный «массив», который:

  • гибкий размер
  • используйте 2 клавиши
  • 1-й ключ - int (гибкий)
  • 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 голосов
/ 04 мая 2010

Вы уверены, что было бы неуместнее создать класс / структуру для хранения данных?Например:

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 };
4 голосов
/ 04 мая 2010

Вы можете просто использовать это:

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

Вместо массива вы также можете использовать List или Dictionary<int, Dat> в этом случае.

0 голосов
/ 04 мая 2010

На самом деле я просто вижу два измерения. Первый - это индекс строки, второй - индекс столбца. И для меня это звучит как DataTable .

0 голосов
/ 04 мая 2010

Я не верю, что вы можете сделать это с Array, если у вас нет единственного массива 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);

}
...