Список<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");
    }
}
Другие вопросы по тегам