Подтвердить что ты не робот

Многомерные списки в С#

В настоящий момент я использую один список для хранения одной части моих данных и отлично работает в этом формате:

Item
----------------
Joe Bloggs
George Forman
Peter Pan

Теперь я хотел бы добавить еще одну строку в этот список, так как она работает так:

NAME                    EMAIL
------------------------------------------------------
Joe Bloggs              [email protected]
George Forman           [email protected]
Peter Pan               [email protected]

Я попытался использовать этот код для создания списка в списке, и этот код используется в другом методе в цикле foreach:

// Where List is instantiated
List<List<string>> list2d = new List<List<string>>

...

// Where DataGrid instance is given the list
dg.DataSource = list2d;
dg.DataBind();

...


// In another method, where all people add their names and emails, then are added
// to the two-dimensional list
foreach (People p in ppl.results) {
    list.Add(results.name);
    list.Add(results.email);
    list2d.Add(list);
}

Когда я запускаю это, я получаю этот результат:

Capacity Count 
----------------
16       16 
16       16 
16       16
...      ...

Где я здесь ошибся. Как я могу получить результат, который я хочу, с помощью кода, который я использую прямо сейчас?

4b9b3361

Ответ 1

Почему вы не используете List<People> вместо List<List<string>>?

Ответ 2

Очень рекомендую что-то подобное:

public class Person {
    public string Name {get; set;}
    public string Email {get; set;}
}

var people = new List<Person>();

Легче читать, легко кодировать.

Ответ 3

Откуда возникают результаты переменных?

Этот блок:

foreach (People p in ppl.results) {
    list.Add(results.name);
    list.Add(results.email);
    list2d.Add(list);
}

Скорее всего, читайте:

foreach (People p in ppl.results) {
    var list = new List<string>();
    list.Add(p.name);
    list.Add(p.email);
    list2d.Add(list);
}

Ответ 4

Вы должны использовать List<Person> или HashSet<Person>.

Ответ 5

Пожалуйста, покажите больше своего кода.

Если этот последний фрагмент кода объявляет и инициализирует переменную list вне цикла, вы в основном повторно используете один и тот же объект списка, тем самым добавляя все в один список.

Также покажите, где .Capacity и .Count входят в игру, как вы получили эти значения?

Ответ 6

Это старый, но я думал, что добавлю свои два цента... Не уверен, что это сработает, но попробуйте использовать KeyValuePair:

 List<KeyValuePair<?, ?>> LinkList = new List<KeyValuePair<?, ?>>();
 LinkList.Add(new KeyValuePair<?, ?>(Object, Object));

В итоге вы получите что-то вроде этого:

 LinkList[0] = <Object, Object>
 LinkList[1] = <Object, Object>
 LinkList[2] = <Object, Object>

и т.д.

Ответ 7

Если по какой-то причине вы не хотите определять класс Person и использовать List<Person> в соответствии с рекомендациями, вы можете использовать кортеж, например (С# 7):

var people = new List<(string Name, string Email)>
{
  ("Joe Bloggs", "[email protected]"),
  ("George Forman", "[email protected]"),
  ("Peter Pan", "[email protected]")
};

var georgeEmail = people[1].Email;

Имена членов Name и Email являются необязательными, вы можете опустить их и получить к ним доступ с помощью Item1 и Item2 соответственно.

Определены кортежи для 8 членов.

Для более ранних версий С# вы все равно можете использовать List<Tuple<string, string>> (или предпочтительно ValueTuple, используя этот пакет NuGet), но вы не будете использовать персонализированные имена участников.