Хочу реализовать комнаты чата, и допустим, в комнате 5 и кто-то в комнату 5 пишет, то сгенерировать событие и переслать всем пользователям комнаты. То-есть не всем разослать, а потом проверить,если он в комнате, а рассылать непосредственно в комнату. Точнее, если юзер 1 в комнате 5, то он подписывается на событие получения нового сообщения, но только не для всех, а для комнаты 5.
Как такое реализовать?
Спасибо
Ну вот вам примерный скелет.
У нас есть сообщение:
class Message
{
// текст сообщения, дата отправления, адресат, ...
}
Весь чат состоит из комнат:
class Chat
{
List<Room> rooms;
public AllRooms => rooms.AsReadOnly();
// и так далее
}
Комната содержит юзеров, список сообщений, и выставляет события прихода нового сообщения (а также, возможно, другие):
class Room
{
List<User> users;
List<Message> messages;
public event EventHandler<NewMessageEventArgs> NewMessage;
void AddMessage(message)
{
// проверки
messages.Add(message);
OnNewMessage(message);
}
void OnNewMessage(Message message) =>
NewMessage?.Invoke(this, message);
}
class NewMessageEventArgs : EventArgs
{
public Message Message { get; }
// ...
}
Юзеры, попадая в комнату, подписываются на приход нового сообщения:
class User
{
void JoinRoom(Room room)
{
try
{
room.AddUser(this);
// комната может и не пустить
}
catch (RoomException ex)
{
// обработать и выйти
}
// получить текущие сообщения...
messages = room.GetCurrentMessages();
// и подписаться на новые:
room.NewMessage += OnNewMessage;
}
}
Вроде бы всё?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть класс матрицы и метод, который возвращает определитель матрицы - DeterminantПо неведомым причинам выходит за пределы двумерного списка
На данный вопрос уже ответили: