Удаление определённого элемента из коллекции

Проблема, пишу телеграмм бота для анонимного общения Проблема будет описана перед второй частью кода

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace AI_telegram_bot
{
    class TelegramUser : INotifyPropertyChanged, IEnumerable<TelegramUser>``
    {
        public TelegramUser(string Nickname, long ChatId) 
        {
            this.nick = Nickname;
            this.id = ChatId;
            Messages = new ObservableCollection<string>();
        }

        private string nick;
        private long id;

        public string Nick 
        {
            get { return this.nick; }
            set 
            {
                this.nick = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.Nick)));
            }
        }
        public long Id 
        {
            get { return this.id; }
            set 
            {
                this.id = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.Id)));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public bool Equals(TelegramUser other) => other.Id == this.id;

        public ObservableCollection<string> Messages { get; set; }

        public void AddMessage(string Text) => Messages.Add(Text);

        public IEnumerator<TelegramUser> GetEnumerator()
        {
            throw new NotImplementedException();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            throw new NotImplementedException();
        }
    }
}

Проблема в этом классе Тут создана коллекция Users и есть условие , если пользователя нет в коллекции то добавляем в ListBox , я не понимаю как реализовать условие при котором если пользователь уже есть в коллекции , то добавлять его не нужно , у меня работает так , я пишу несколько сообщений от одного имени и у меня для каждого сообщения программа создает новое место в ListBox Вот пример тут я отправил 3 сообщения боту и для каждого Создается отдельное место

using System;
using System.Windows;
using System.IO;
using System.Collections.ObjectModel;
using Telegram.Bot;

namespace AI_telegram_bot
{
    public partial class MainWindow : Window
    {
        ObservableCollection<TelegramUser> Users;
        TelegramBotClient bot;

        [Obsolete]
        public MainWindow()
        {
            InitializeComponent();
            Users = new ObservableCollection<TelegramUser>();
            usersList.ItemsSource = Users;

            var token = "...";
            bot = new TelegramBotClient(token);

            bot.OnMessage += delegate (object sender, Telegram.Bot.Args.MessageEventArgs e)
            {
                string msg = $"{DateTime.Now}: {e.Message.Chat.FirstName} {e.Message.Chat.Id} {e.Message.Text}";
                File.AppendAllText("data.log",$"{msg}\n");

                this.Dispatcher.Invoke(() =>
                {
                    var person = new TelegramUser(e.Message.Chat.FirstName, e.Message.Chat.Id);
                    if (!Users.Contains(person)) Users.Add(person);
                    Users[Users.IndexOf(person)].AddMessage($"{person.Nick}: {e.Message.Text}");
                });
            };

            bot.StartReceiving();

            ButtonSendMessage.Click += delegate { SendMessage(); };
            txtBoxSendMessage.KeyDown += (s, e) => { if (e.Key == System.Windows.Input.Key.Return) { SendMessage(); } };
        }

        public void SendMessage() 
        {
            var concreteUser = Users[Users.IndexOf(usersList.SelectedItem as TelegramUser)];
            string responseMsg = $"Support: {txtBoxSendMessage.Text}";
            concreteUser.Messages.Add(responseMsg);

            bot.SendTextMessageAsync(concreteUser.Id, txtBoxSendMessage.Text);
            string logText = $"{DateTime.Now}: >> {concreteUser.Id} {concreteUser.Nick} {responseMsg}\n";
            File.AppendAllText("data.log", logText);

            txtBoxSendMessage.Text = String.Empty;
        }
    }
}

Ответы (1 шт):

Автор решения: Uranus

Метод Contains не работает, потому что в классе TelegramUser не переопределен метод Equals. Точнее добавлен новый:

public bool Equals(TelegramUser other) => other.Id == this.id;

Чтобы переопределить метод, необходимо добавить модификатор override.

public override bool Equals(object other) => other.Id == this.id;

Можно обойтись и без переопределения Equals если использовать метод-расширение Any из пространства имён System.Linq.

if(!Users.Any(u => u.Id == person.id))
→ Ссылка