Ответ 1
Почему вы не используете List<People>
вместо List<List<string>>
?
В настоящий момент я использую один список для хранения одной части моих данных и отлично работает в этом формате:
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
... ...
Где я здесь ошибся. Как я могу получить результат, который я хочу, с помощью кода, который я использую прямо сейчас?
Почему вы не используете List<People>
вместо List<List<string>>
?
Очень рекомендую что-то подобное:
public class Person {
public string Name {get; set;}
public string Email {get; set;}
}
var people = new List<Person>();
Легче читать, легко кодировать.
Откуда возникают результаты переменных?
Этот блок:
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);
}
Вы должны использовать List<Person>
или HashSet<Person>
.
Пожалуйста, покажите больше своего кода.
Если этот последний фрагмент кода объявляет и инициализирует переменную list
вне цикла, вы в основном повторно используете один и тот же объект списка, тем самым добавляя все в один список.
Также покажите, где .Capacity и .Count входят в игру, как вы получили эти значения?
Это старый, но я думал, что добавлю свои два цента... Не уверен, что это сработает, но попробуйте использовать 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>
и т.д.
Если по какой-то причине вы не хотите определять класс 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), но вы не будете использовать персонализированные имена участников.