2010-05-04 2 views
5

Я пытаюсь выяснить, как построить многомерную «массив», то есть:Многомерный массив C#, ArrayList или хеш-таблица?

  • гибкий размер
  • использовать 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"]); 

ответ

10

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

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

var list = new Список (); list.Add (новое лицо()); Очень интересно Как добавить значения? list.Add (новое лицо() {FirstName = "Joe", LastName = "Smith", Phone = "foo"}); вот так? –

+0

@ База данных: я обновил свой ответ, чтобы уточнить. –

0

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

} 
+0

О, извините, я не подобрал 2 части. – Grokodile

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

Если первый индекс i с последовательным, вы, конечно, можете просто использовать массив словарей:

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

+1 от меня для правильного ответа вопрос lol – Grokodile

0

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

+0

в этом примере http://dotnetperls.com/datatable-foreach как показать ярлык товара {имя, телефон} вместо "item:" приветствия –

Смежные вопросы