Я отредактировал свой пост, информируя подробнее.

У меня есть класс терминала, и я динамически создаю его экземпляры.

У него есть таймер, который, если Lista> 0, будет связываться с устройством.

public class Terminal 
{
        public string Endereco { get; set; }
        List<string> Lista = new List<string>();
        System.Timers.Timer timer;
 
        public Terminal()
        {     
            this.timer = new System.Timers.Timer(); 
            this.timer.Interval = 500;     
            this.timer.Enabled = true;         
            this.timer.Elapsed += ProcessaTimer;
        }

        private void ProcessaTimer(object sender, System.Timers.ElapsedEventArgs e)
        {   
              if (Lista.count > 0)      
                 ProcessaLista();
        }      

        public void ProcessaLista()
        {
            //Send command to device

        }

       public void AdicionaLista(Comando comando)
        {
            Lista.Add(comando));
        } 
}

У меня есть класс Principal, который создает экземпляр класса Terminal и метод, который получает информацию от других процессов:

Эти экземпляры являются динамическими, я помещаю эти значения только для иллюстрации

public class Principal
{
    public Principal()
    {
        Terminal Obj = new Terminal();
        Obj .Endereco = "192.168.0.100";

        Obj = new Terminal();
        Obj .Endereco = "192.168.0.200";

        Obj = new Terminal();
        Obj .Endereco = "192.168.0.300";
    }
        
    void RecebeDados(Comando comando)
    {
        //if comando.Endereco == "192.168.0.100"
        //You must add to the list referring to the instance whose address is 192.168.0.100


        //if comando.Endereco == "192.168.0.200"
        //You must add to the list referring to the instance whose address is 192.168.0.200
        //

        //if comando.Endereco == "192.168.0.300"
        //You must add to the list referring to the instance whose address is 192.168.0.300
        //

    }
}

Командный класс, получающий данные

public class Comando
{
    public string Endereco { get; set; }
    public string Mensagem { get; set; }
}

У меня вопрос по методу ReceiveData. Как внести каждую полученную команду в список, соответствующий терминалу? Каждая команда отправляется на терминал, эквивалентный IP-адресу. Команда должна быть добавлена ​​только в 1 список по IP-адресу

Как сделать?

c#
2
Nádia Teles 17 Сен 2021 в 16:21

2 ответа

Лучший ответ

Я вижу здесь два варианта. Используйте словарь или список и запросите его с помощью Linq. Словарь может быть лучшим решением:

public class Terminal
{
    private static Dictionary<string, Terminal> _allTerminals;

    public string Endereco { get; set; }
    List<string> Lista = new List<string>();

    public Terminal(string ip) 
    {
        Terminal._allTerminals.Add(ip, this);
    }

    public static Terminal GetTerminalByIp(string ip) 
    {
        return Terminal._allTerminals[ip];
    }

    ~Terminal()  // finalizer
    {
         Terminal._allTerminals.Remove(this.Endereco);
    }

    public void AdicionaLista(string comando)
    {
        Lista.Add(comando));
    }
 }

Затем вы создаете экземпляр и получаете объект следующим образом:

Terminal obj = new Terminal("192.168.1.1");


Terminal fetched Terminal = Terminal.GetTerminalByIp("192.168.1.1");
1
johannespartin 17 Сен 2021 в 13:42

Вы составляете список объектов

var myList = new List<Terminal>();
myList.Add(new Terminal(){Endereco = "192.168.0.100"});
...

Затем вы можете использовать linq, чтобы найти правильный элемент

myList.First(t => t.Endereco == myAddress).Lista.Add(myReceivedValues);

Обратите внимание, что этот пример не обрабатывается, если нет соответствующего элемента. Вы можете использовать FirstOrDefault и проверить значение null, чтобы справиться с этим. Кроме того, можно использовать обычный список, если имеется несколько значений. Если их много, скажем тысячи или больше, лучше использовать словарь, чем простой список.

0
JonasH 17 Сен 2021 в 13:46