#c# #loops #if-statement
#c# #циклы #if-оператор
Вопрос:
Я создаю веб-сайт, на котором есть компонент чата. Приведенный ниже код получает от хранимой процедуры список сообщений с множеством различных параметров. 1 из них — если сообщение является ответом на другое, и если это так, продублируйте сообщение, на которое дается ответ, поверх ответа на сообщение. Если сообщение, на которое был дан ответ, также было ответом на предыдущее сообщение, выполните то же самое. Теперь моя проблема в том, что я не смог понять, как автоматизировать эту часть кода без вложенности if друг в друга до тех пор, пока я не надеюсь, что пользователи больше не будут отвечать в той же цепочке.
- Чтобы перефразировать это, я просматриваю список в обратном порядке и проверяю, не является ли ReplyingTo null .
- Затем я копирую строку с тем же идентификатором и отвечаю на 1 строку выше, чем текущая строка.
- Затем я подтверждаю, что в этой новой строке есть ReplyingTo
- Если это так, я копирую этот объект на 2 строки выше текущего.
- и я бы продолжал этот путь, пока не достиг определенной точки, которую пользователи не достигнут.
Если у кого-нибудь есть идея о том, как действовать дальше, я был бы очень любезен. Ниже я привел пример типа данных, которые будут переданы этой функции.
for (int i = publicChatCountList.Count-1 ; i > -1; i--)
{
if (publicChatCountList[i].ReplyingTo.HasValue)
{
Chat_Dto chatItem = new Chat_Dto();
long? ReplyingToId = publicChatCountList[i].ReplyingTo;
chatItem = publicChatCountList.Find(x => x.Id == ReplyingToId);
publicChatCountList.Insert(i 1, new Chat_Dto() {Text = chatItem.Text, IsPublic = chatItem.IsPublic, IsApproved = chatItem.IsApproved, ReplyingTo = chatItem.ReplyingTo });
publicChatCountList[i 1].Duplicate = true;
if (chatItem.ReplyingTo.HasValue)
{
Chat_Dto chatItem2 = new Chat_Dto();
long? ReplyingToId2 = chatItem.ReplyingTo;
chatItem2 = publicChatCountList.Find(x => x.Id == ReplyingToId2);
publicChatCountList.Insert(i 2, new Chat_Dto() { Text = chatItem2.Text, IsPublic = chatItem2.IsPublic, IsApproved = chatItem2.IsApproved, ReplyingTo = chatItem2.ReplyingTo });
publicChatCountList[i 2].Duplicate = true;
}
}
}
Комментарии:
1. Вам придется сделать это с помощью рекурсивного метода. Сначала попытайте счастья с этим. Также: почему вы делаете это так? Похоже, что-то в вашем дизайне не так.
publicChatCountList
Для чего используется?2. publicChatCountList — это мой список, созданный таблицей под кодом, и он проверяет рекурсивные методы, спасибо
Ответ №1:
Если я правильно вас понял, возможно, будет работать что-то вроде этого, чтобы рекурсивно получить все ответы:
private void Replies(Chat_Dto_List publicChatCountList,int i)
{
if (publicChatCountList[i].ReplyingTo.HasValue)
{
Chat_Dto chatItem = new Chat_Dto();
long? ReplyingToId = publicChatCountList[i].ReplyingTo;
chatItem = publicChatCountList.Find(x => x.Id == ReplyingToId);
publicChatCountList.Insert(i 1, new Chat_Dto() { Text = chatItem.Text, IsPublic = chatItem.IsPublic, IsApproved = chatItem.IsApproved, ReplyingTo = chatItem.ReplyingTo });
publicChatCountList[i 1].Duplicate = true;
if (chatItem.ReplyingTo.HasValue)
{
Replies(publicChatCountList, publicChatCountList.FindIndex(x => x.Id == chatItem.ReplyingTo))
}
}
}