Список<T>, где T - класс с двумя членами, где один член - другой список. Как мне добавить / установить переменные?
Я новичок в C#, а также в распространении на другие объектно-ориентированные языки, так что извините за мое незнание. Я пытаюсь создать переменную List, которая связана с классом с двумя членами, например:
List<bus> bus_list_2d = new List<bus>();
public class bus
{
public string channel { get; set; }
public List<String> label { get; set; }
}
Я буду разбирать XML-документ, которому назначен канал, который содержит несколько меток буферов. Точное количество каналов неизвестно и одинаково для меток буфера, поэтому я и хотел использовать Список.
Мне было интересно, как мне создать функцию "Добавить", в которой я бы добавил один канал, а затем продолжал добавлять элементы меток, а затем переходил к следующему каналу и добавлял элементы меток под этим и так далее. Может кто-нибудь дать мне пример фрагмента для этого, пожалуйста?
4 ответа
В C# мы используем имена PascalCase для типов и открытых членов. Итак, лучше использовать следующие имена:
public class Bus
{
public string Channel { get; set; }
public List<string> Labels { get; set; }
}
Создание нового списка автобусов будет выглядеть так:
List<Bus> buses = new List<Bus>();
Bus bus1 = new Bus();
bus1.Channel = "Channel 6";
bus1.Labels = new List<string>();
bus1.Labels.Add("label A");
bus1.Labels.Add("label B");
buses.Add(bus1);
Также вы можете использовать инициализаторы объектов и коллекций:
List<Bus> buses = new List<Bus> {
new Bus {
Channel = "Channel 6",
Labels = new List<string> {
"label A",
"label B"
}
}
};
Вероятно, проще добавить временную переменную, а затем добавить ее в bus_list_2d
:
bus b = new bus();
b.channel = "channel";
b.label = new List<string>();
b.label.Add( "label1" ); // this will probably be done in a loop of some kind
// ...
bus_list_2d.Add( b );
Кроме того, вы, вероятно, хотите иметь конструктор bus
инициализация класса label
к новому List<string>
так что вам не нужно явно делать это. Также, пожалуйста, следуйте соглашениям об именах. Классы, свойства и методы пишутся с заглавной буквы и используют случай верблюда.
public class Bus
{
public string Channel { get; set; }
public List<String> Label { get; set; }
public Bus( string channel = "" )
{
this.Channel = channel;
this.Label = new List<string>();
}
}
Вы можете попробовать что-то вроде этого:
var busInfo = new Dictionay<string, List<string>>();
foreach(var channel in channels)
{
busInfo.Add(channel, new List<string>());
foreach(var label in channel.labels)
{
busInfo[channel].Add(label);
}
}
Попробуйте использовать params
атрибут аргумента для метода AddBus()
передать всю информацию одной строкой (см. Program
ниже).
public class Foo
{
List<bus> bus_list_2d=new List<bus>();
public void AddBus(string channel, params string[] labels)
{
bus_list_2d.Add(new bus()
{
channel=channel,
label=new List<string>(labels)
});
}
}
public class bus
{
public string channel { get; set; }
public List<String> label { get; set; }
}
class Program
{
static void Main(string[] args)
{
Foo foo=new Foo();
foo.AddBus("ABC", "A", "B", "C");
}
}