Outlook Interop 删除约会匹配模式

Outlook Interop Delete Appointments Matching Patern

所以,基本上,我想做的是删除 Outlook 中所有符合特定模式的约会(这是一个简单的约会,所以不需要 Regex)。

因此,我使用以下代码使用互操作检索日历中的每个项目。

Outlook.Application outlook = new Outlook.Application();
Outlook.NameSpace mapiNameSpace = outlook.GetNamespace("MAPI");
Outlook.MAPIFolder calendarFolder = mapiNameSpace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
Outlook.Items outlookCalendarItems = calendarFolder.Items;

然后用下面的代码遍历并删除它们:

foreach (Outlook.AppointmentItem appointment in outlookCalendarItems)
{
     if (appointment.Subject.Contains("On Call: Regions:"))
     {
          appointment.Delete();
     }
}

但是,由于某种原因,有些项目似乎被删除了,有些项目被遗漏了,没有明显的原因。每个约会的 Subject 以相同的方式为每个约会生成(在应用程序的不同部分):

appt.Subject = $"On Call: {appointment.Region}";

其中 appointment.Region 是使用以下方法生成的:

Region = $"Regions: {regions.Aggregate((x, y) => x + " & " + y)}"

这导致:

On Call: Regions: 6 & 7

On Call: Regions: NS

etc...

因此,如果它对某些人有效,那么它应该对所有人都有效。

有什么想法吗?

如果从项目集合中删除,您必须从头到尾删除,最好使用索引器。这意味着如果您删除一个项目,它将从项目集合中删除并发送到已删除的文件夹。

这在 MSDN

中有记录

如果您不这样做,而是从头开始迭代,则该项目将被删除,之后的项目将替换它。所以很可能你正在跳过一个条目。如果以下项目也符合您的过滤器,您就不会删除它。这就解释了为什么你在第二个 运行.
上找到它 这不是 .net 集合。您正在使用互操作包装器。它的行为可能与您在 C# 中的预期不同。

例如试试这个。根据文档,索引是基于 1 的。不是基于 0 - 但最好仔细检查你自己,因为我目前无法自己测试它:

for (int i = outlookCalenderItems.Count; i > 0; i--)
{
     if (outlookCalenderItems[i].Subject.Contains("On Call: Regions:"))
     {
          outlookCalenderItems[i].Delete();
     }
}