Удаление определённого элемента из коллекции
Проблема, пишу телеграмм бота для анонимного общения Проблема будет описана перед второй частью кода
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 
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 шт):
Метод 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))