Я считаю, что самый простой способ взглянуть на проблему такого рода - это использовать множество разрывов строк и отступов. Я добавляю разрыв и увеличиваю отступ после каждого (
(кроме тривиального ()
), помещаю соответствующие )
s ниже их соответствующей пары и помещаю операторы в отдельные строки между элементами, к которым они присоединяются:
if (
string.Equals(
item.ItemClass,
"IPM.Note.EnterpriseVault.Shortcut", StringComparison.InvariantCulture
)
||
(
(
existingIds.Any(
x => x.ConversationId == item.ConversationId.ToString()
) == false
||
(
item.ItemClass == "IPM.Appointment"
&&
existingIds.Any(
x => x.MessageId == item.Id.ToString()
) == false
)
&&
item.DateTimeReceived < snapshotDate
)
)
)
{
item.Delete(DeleteMode.HardDelete);
}
Я могу сразу заметить две вещи - есть пара скобок, которая просто содержит другую пару, и у нас есть &&
и ||
, встречающиеся на одном и том же "уровне", поэтому мы полагаемся на приоритет оператора.
Я предполагаю, что вы хотели &&
за пределами внутренних скобок, чтобы он применялся как к проверке назначения, так и к существующей проверке идентификаторов. Например, вместо этого:
if (
string.Equals(
item.ItemClass,
"IPM.Note.EnterpriseVault.Shortcut", StringComparison.InvariantCulture
)
||
(
(
existingIds.Any(
x => x.ConversationId == item.ConversationId.ToString()
) == false
||
(
item.ItemClass == "IPM.Appointment"
&&
existingIds.Any(
x => x.MessageId == item.Id.ToString()
) == false
)
)
&&
item.DateTimeReceived < snapshotDate
)
)
{
item.Delete(DeleteMode.HardDelete);
}
(Как только вы подтвердите, что все соответствует, как вам нужно, вы можете свернуть обратно на меньшее количество строк)